jj/latest/templates/index.html

2617 lines
68 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://jj-vcs.github.io/jj/latest/templates/">
<link rel="prev" href="../revsets/">
<link rel="next" href="../git-comparison/">
<link rel="icon" href="../images/favicon-96x96.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.4">
<title>Templating language - Jujutsu docs</title>
<link rel="stylesheet" href="../assets/stylesheets/main.8608ea7d.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#templates" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Jujutsu docs" class="md-header__button md-logo" aria-label="Jujutsu docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Jujutsu docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Templating language
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Jujutsu docs" class="md-nav__button md-logo" aria-label="Jujutsu docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Jujutsu docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Getting started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../install-and-setup/" class="md-nav__link">
<span class="md-ellipsis">
Installation and setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tutorial/" class="md-nav__link">
<span class="md-ellipsis">
Tutorial and bird's eye view
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
<span class="md-ellipsis">
Working with GitHub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../windows/" class="md-nav__link">
<span class="md-ellipsis">
Working on Windows
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../FAQ/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli-reference/" class="md-nav__link">
<span class="md-ellipsis">
CLI reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testimonials/" class="md-nav__link">
<span class="md-ellipsis">
Testimonials
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../community_tools/" class="md-nav__link">
<span class="md-ellipsis">
Community-built tools
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Concepts
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Concepts
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../working-copy/" class="md-nav__link">
<span class="md-ellipsis">
Working copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bookmarks/" class="md-nav__link">
<span class="md-ellipsis">
Bookmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../conflicts/" class="md-nav__link">
<span class="md-ellipsis">
Conflicts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../operation-log/" class="md-nav__link">
<span class="md-ellipsis">
Operation log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../glossary/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/" class="md-nav__link">
<span class="md-ellipsis">
Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filesets/" class="md-nav__link">
<span class="md-ellipsis">
Fileset language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../revsets/" class="md-nav__link">
<span class="md-ellipsis">
Revset language
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Templating language
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Templating language
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#keywords" class="md-nav__link">
<span class="md-ellipsis">
Keywords
</span>
</a>
<nav class="md-nav" aria-label="Keywords">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#commit-keywords" class="md-nav__link">
<span class="md-ellipsis">
Commit keywords
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operation-keywords" class="md-nav__link">
<span class="md-ellipsis">
Operation keywords
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operators" class="md-nav__link">
<span class="md-ellipsis">
Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#global-functions" class="md-nav__link">
<span class="md-ellipsis">
Global functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#types" class="md-nav__link">
<span class="md-ellipsis">
Types
</span>
</a>
<nav class="md-nav" aria-label="Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#annotationline-type" class="md-nav__link">
<span class="md-ellipsis">
AnnotationLine type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boolean-type" class="md-nav__link">
<span class="md-ellipsis">
Boolean type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commit-type" class="md-nav__link">
<span class="md-ellipsis">
Commit type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commitid-changeid-type" class="md-nav__link">
<span class="md-ellipsis">
CommitId / ChangeId type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commitref-type" class="md-nav__link">
<span class="md-ellipsis">
CommitRef type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configvalue-type" class="md-nav__link">
<span class="md-ellipsis">
ConfigValue type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cryptographicsignature-type" class="md-nav__link">
<span class="md-ellipsis">
CryptographicSignature type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#diffstats-type" class="md-nav__link">
<span class="md-ellipsis">
DiffStats type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#email-type" class="md-nav__link">
<span class="md-ellipsis">
Email type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#integer-type" class="md-nav__link">
<span class="md-ellipsis">
Integer type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#list-type" class="md-nav__link">
<span class="md-ellipsis">
List type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#listtemplate-type" class="md-nav__link">
<span class="md-ellipsis">
ListTemplate type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operation-type" class="md-nav__link">
<span class="md-ellipsis">
Operation type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operationid-type" class="md-nav__link">
<span class="md-ellipsis">
OperationId type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#option-type" class="md-nav__link">
<span class="md-ellipsis">
Option type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repopath-type" class="md-nav__link">
<span class="md-ellipsis">
RepoPath type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shortestidprefix-type" class="md-nav__link">
<span class="md-ellipsis">
ShortestIdPrefix type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#signature-type" class="md-nav__link">
<span class="md-ellipsis">
Signature type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sizehint-type" class="md-nav__link">
<span class="md-ellipsis">
SizeHint type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#string-type" class="md-nav__link">
<span class="md-ellipsis">
String type
</span>
</a>
<nav class="md-nav" aria-label="String type">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#string-literals" class="md-nav__link">
<span class="md-ellipsis">
String literals
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#template-type" class="md-nav__link">
<span class="md-ellipsis">
Template type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamp-type" class="md-nav__link">
<span class="md-ellipsis">
Timestamp type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamprange-type" class="md-nav__link">
<span class="md-ellipsis">
TimestampRange type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treediff-type" class="md-nav__link">
<span class="md-ellipsis">
TreeDiff type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treediffentry-type" class="md-nav__link">
<span class="md-ellipsis">
TreeDiffEntry type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treeentry-type" class="md-nav__link">
<span class="md-ellipsis">
TreeEntry type
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
Comparisons
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
Comparisons
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../git-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Git comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../git-command-table/" class="md-nav__link">
<span class="md-ellipsis">
Git command table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../git-compatibility/" class="md-nav__link">
<span class="md-ellipsis">
Git compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sapling-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Sapling comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../related-work/" class="md-nav__link">
<span class="md-ellipsis">
Other related work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
<span class="md-ellipsis">
Technical details
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
Technical details
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../technical/architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../technical/concurrency/" class="md-nav__link">
<span class="md-ellipsis">
Concurrency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../technical/conflicts/" class="md-nav__link">
<span class="md-ellipsis">
Conflicts
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
<span class="md-ellipsis">
Contributing
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../contributing/" class="md-nav__link">
<span class="md-ellipsis">
Guidelines and "How to...?"
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../code-of-conduct/" class="md-nav__link">
<span class="md-ellipsis">
Code of conduct
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design_docs/" class="md-nav__link">
<span class="md-ellipsis">
Design docs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design_doc_blueprint/" class="md-nav__link">
<span class="md-ellipsis">
Design doc blueprint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releasing/" class="md-nav__link">
<span class="md-ellipsis">
Releasing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../governance/temporary-voting/" class="md-nav__link">
<span class="md-ellipsis">
Temporary voting for governance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../governance/GOVERNANCE/" class="md-nav__link">
<span class="md-ellipsis">
Governance
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
<span class="md-ellipsis">
Design docs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
Design docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../design/git-submodules/" class="md-nav__link">
<span class="md-ellipsis">
git-submodules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design/git-submodule-storage/" class="md-nav__link">
<span class="md-ellipsis">
git-submodule-storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design/run/" class="md-nav__link">
<span class="md-ellipsis">
JJ run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design/sparse-v2/" class="md-nav__link">
<span class="md-ellipsis">
Sparse patterns v2
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design/tracking-branches/" class="md-nav__link">
<span class="md-ellipsis">
Tracking branches
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../design/copy-tracking/" class="md-nav__link">
<span class="md-ellipsis">
Copy tracking and tracing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Development roadmap
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#keywords" class="md-nav__link">
<span class="md-ellipsis">
Keywords
</span>
</a>
<nav class="md-nav" aria-label="Keywords">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#commit-keywords" class="md-nav__link">
<span class="md-ellipsis">
Commit keywords
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operation-keywords" class="md-nav__link">
<span class="md-ellipsis">
Operation keywords
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operators" class="md-nav__link">
<span class="md-ellipsis">
Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#global-functions" class="md-nav__link">
<span class="md-ellipsis">
Global functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#types" class="md-nav__link">
<span class="md-ellipsis">
Types
</span>
</a>
<nav class="md-nav" aria-label="Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#annotationline-type" class="md-nav__link">
<span class="md-ellipsis">
AnnotationLine type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boolean-type" class="md-nav__link">
<span class="md-ellipsis">
Boolean type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commit-type" class="md-nav__link">
<span class="md-ellipsis">
Commit type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commitid-changeid-type" class="md-nav__link">
<span class="md-ellipsis">
CommitId / ChangeId type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#commitref-type" class="md-nav__link">
<span class="md-ellipsis">
CommitRef type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configvalue-type" class="md-nav__link">
<span class="md-ellipsis">
ConfigValue type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cryptographicsignature-type" class="md-nav__link">
<span class="md-ellipsis">
CryptographicSignature type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#diffstats-type" class="md-nav__link">
<span class="md-ellipsis">
DiffStats type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#email-type" class="md-nav__link">
<span class="md-ellipsis">
Email type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#integer-type" class="md-nav__link">
<span class="md-ellipsis">
Integer type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#list-type" class="md-nav__link">
<span class="md-ellipsis">
List type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#listtemplate-type" class="md-nav__link">
<span class="md-ellipsis">
ListTemplate type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operation-type" class="md-nav__link">
<span class="md-ellipsis">
Operation type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#operationid-type" class="md-nav__link">
<span class="md-ellipsis">
OperationId type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#option-type" class="md-nav__link">
<span class="md-ellipsis">
Option type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repopath-type" class="md-nav__link">
<span class="md-ellipsis">
RepoPath type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shortestidprefix-type" class="md-nav__link">
<span class="md-ellipsis">
ShortestIdPrefix type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#signature-type" class="md-nav__link">
<span class="md-ellipsis">
Signature type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sizehint-type" class="md-nav__link">
<span class="md-ellipsis">
SizeHint type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#string-type" class="md-nav__link">
<span class="md-ellipsis">
String type
</span>
</a>
<nav class="md-nav" aria-label="String type">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#string-literals" class="md-nav__link">
<span class="md-ellipsis">
String literals
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#template-type" class="md-nav__link">
<span class="md-ellipsis">
Template type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamp-type" class="md-nav__link">
<span class="md-ellipsis">
Timestamp type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timestamprange-type" class="md-nav__link">
<span class="md-ellipsis">
TimestampRange type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treediff-type" class="md-nav__link">
<span class="md-ellipsis">
TreeDiff type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treediffentry-type" class="md-nav__link">
<span class="md-ellipsis">
TreeDiffEntry type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#treeentry-type" class="md-nav__link">
<span class="md-ellipsis">
TreeEntry type
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="templates">Templates<a class="headerlink" href="#templates" title="Permanent link">&para;</a></h1>
<p>Jujutsu supports a functional language to customize output of commands.
The language consists of literals, keywords, operators, functions, and
methods.</p>
<p>A couple of <code>jj</code> commands accept a template via <code>-T</code>/<code>--template</code> option.</p>
<h2 id="keywords">Keywords<a class="headerlink" href="#keywords" title="Permanent link">&para;</a></h2>
<p>Keywords represent objects of different types; the types are described in
a follow-up section. In addition to context-specific keywords, the top-level
object can be referenced as <code>self</code>.</p>
<h3 id="commit-keywords">Commit keywords<a class="headerlink" href="#commit-keywords" title="Permanent link">&para;</a></h3>
<p>In <code>jj log</code>/<code>jj evolog</code> templates, all 0-argument methods of <a href="#commit-type">the <code>Commit</code>
type</a> are available as keywords. For example, <code>commit_id</code> is
equivalent to <code>self.commit_id()</code>.</p>
<h3 id="operation-keywords">Operation keywords<a class="headerlink" href="#operation-keywords" title="Permanent link">&para;</a></h3>
<p>In <code>jj op log</code> templates, all 0-argument methods of <a href="#operation-type">the <code>Operation</code>
type</a> are available as keywords. For example,
<code>current_operation</code> is equivalent to <code>self.current_operation()</code>.</p>
<h2 id="operators">Operators<a class="headerlink" href="#operators" title="Permanent link">&para;</a></h2>
<p>The following operators are supported.</p>
<ul>
<li><code>x.f()</code>: Method call.</li>
<li><code>-x</code>: Negate integer value.</li>
<li><code>!x</code>: Logical not.</li>
<li><code>x &gt;= y</code>, <code>x &gt; y</code>, <code>x &lt;= y</code>, <code>x &lt; y</code>: Greater than or equal/greater than/
lesser than or equal/lesser than. Operands must be <code>Integer</code>s.</li>
<li><code>x == y</code>, <code>x != y</code>: Equal/not equal. Operands must be either <code>Boolean</code>,
<code>Integer</code>, or <code>String</code>.</li>
<li><code>x &amp;&amp; y</code>: Logical and, short-circuiting.</li>
<li><code>x || y</code>: Logical or, short-circuiting.</li>
<li><code>x ++ y</code>: Concatenate <code>x</code> and <code>y</code> templates.</li>
</ul>
<p>(listed in order of binding strengths)</p>
<h2 id="global-functions">Global functions<a class="headerlink" href="#global-functions" title="Permanent link">&para;</a></h2>
<p>The following functions are defined.</p>
<ul>
<li><code>fill(width: Integer, content: Template) -&gt; Template</code>: Fill lines at
the given <code>width</code>.</li>
<li><code>indent(prefix: Template, content: Template) -&gt; Template</code>: Indent
non-empty lines by the given <code>prefix</code>.</li>
<li><code>pad_start(width: Integer, content: Template[, fill_char: Template])</code>: Pad (or
right-justify) content by adding leading fill characters. The <code>content</code>
shouldn't have newline character.</li>
<li><code>pad_end(width: Integer, content: Template[, fill_char: Template])</code>: Pad (or
left-justify) content by adding trailing fill characters. The <code>content</code>
shouldn't have newline character.</li>
<li><code>pad_centered(width: Integer, content: Template[, fill_char: Template])</code>: Pad
content by adding both leading and trailing fill characters. If an odd number
of fill characters are needed, the trailing fill will be one longer than the
leading fill. The <code>content</code> shouldn't have newline characters.</li>
<li><code>truncate_start(width: Integer, content: Template[, ellipsis: Template])</code>:
Truncate <code>content</code> by removing leading characters. The <code>content</code> shouldn't
have newline character. If <code>ellipsis</code> is provided and <code>content</code> was truncated,
prepend the <code>ellipsis</code> to the result.</li>
<li><code>truncate_end(width: Integer, content: Template[, ellipsis: Template])</code>:
Truncate <code>content</code> by removing trailing characters. The <code>content</code> shouldn't
have newline character. If <code>ellipsis</code> is provided and <code>content</code> was truncated,
append the <code>ellipsis</code> to the result.</li>
<li><code>label(label: Template, content: Template) -&gt; Template</code>: Apply label to
the content. The <code>label</code> is evaluated as a space-separated string.</li>
<li><code>raw_escape_sequence(content: Template) -&gt; Template</code>: Preserves any escape
sequences in <code>content</code> (i.e., bypasses sanitization) and strips labels.
Note: This function is intended for escape sequences and as such, its output
is expected to be invisible / of no display width. Outputting content with
nonzero display width may break wrapping, indentation etc.</li>
<li><code>stringify(content: Template) -&gt; String</code>: Format <code>content</code> to string. This
effectively removes color labels.</li>
<li><code>if(condition: Boolean, then: Template[, else: Template]) -&gt; Template</code>:
Conditionally evaluate <code>then</code>/<code>else</code> template content.</li>
<li><code>coalesce(content: Template...) -&gt; Template</code>: Returns the first <strong>non-empty</strong>
content.</li>
<li><code>concat(content: Template...) -&gt; Template</code>:
Same as <code>content_1 ++ ... ++ content_n</code>.</li>
<li><code>separate(separator: Template, content: Template...) -&gt; Template</code>:
Insert separator between <strong>non-empty</strong> contents.</li>
<li><code>surround(prefix: Template, suffix: Template, content: Template) -&gt; Template</code>:
Surround <strong>non-empty</strong> content with texts such as parentheses.</li>
<li><code>config(name: String) -&gt; ConfigValue</code>: Look up configuration value by <code>name</code>.</li>
</ul>
<h2 id="types">Types<a class="headerlink" href="#types" title="Permanent link">&para;</a></h2>
<h3 id="annotationline-type">AnnotationLine type<a class="headerlink" href="#annotationline-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.commit() -&gt; Commit</code>: Commit responsible for changing the relevant line.</li>
<li><code>.content() -&gt; Template</code>: Line content including newline character.</li>
<li><code>.line_number() -&gt; Integer</code>: 1-based line number.</li>
<li><code>.first_line_in_hunk() -&gt; Boolean</code>: False when the directly preceding line
references the same commit.</li>
</ul>
<h3 id="boolean-type">Boolean type<a class="headerlink" href="#boolean-type" title="Permanent link">&para;</a></h3>
<p>No methods are defined. Can be constructed with <code>false</code> or <code>true</code> literal.</p>
<h3 id="commit-type">Commit type<a class="headerlink" href="#commit-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.description() -&gt; String</code></li>
<li><code>.change_id() -&gt; ChangeId</code></li>
<li><code>.commit_id() -&gt; CommitId</code></li>
<li><code>.parents() -&gt; List&lt;Commit&gt;</code></li>
<li><code>.author() -&gt; Signature</code></li>
<li><code>.committer() -&gt; Signature</code></li>
<li><code>.signature() -&gt; Option&lt;CryptographicSignature&gt;</code></li>
<li><code>.mine() -&gt; Boolean</code>: Commits where the author's email matches the email of
the current user.</li>
<li><code>.working_copies() -&gt; String</code>: For multi-workspace repository, indicate
working-copy commit as <code>&lt;workspace name&gt;@</code>.</li>
<li><code>.current_working_copy() -&gt; Boolean</code>: True for the working-copy commit of the
current workspace.</li>
<li><code>.bookmarks() -&gt; List&lt;CommitRef&gt;</code>: Local and remote bookmarks pointing to the
commit. A tracking remote bookmark will be included only if its target is
different from the local one.</li>
<li><code>.local_bookmarks() -&gt; List&lt;CommitRef&gt;</code>: All local bookmarks pointing to the
commit.</li>
<li><code>.remote_bookmarks() -&gt; List&lt;CommitRef&gt;</code>: All remote bookmarks pointing to the
commit.</li>
<li><code>.tags() -&gt; List&lt;CommitRef&gt;</code></li>
<li><code>.git_refs() -&gt; List&lt;CommitRef&gt;</code></li>
<li><code>.git_head() -&gt; Boolean</code>: True for the Git <code>HEAD</code> commit.</li>
<li><code>.divergent() -&gt; Boolean</code>: True if the commit's change id corresponds to multiple
visible commits.</li>
<li><code>.hidden() -&gt; Boolean</code>: True if the commit is not visible (a.k.a. abandoned).</li>
<li><code>.immutable() -&gt; Boolean</code>: True if the commit is included in <a href="../config/#set-of-immutable-commits">the set of
immutable commits</a>.</li>
<li><code>.contained_in(revset: String) -&gt; Boolean</code>: True if the commit is included in <a href="../revsets/">the provided revset</a>.</li>
<li><code>.conflict() -&gt; Boolean</code>: True if the commit contains merge conflicts.</li>
<li><code>.empty() -&gt; Boolean</code>: True if the commit modifies no files.</li>
<li><code>.diff([files: String]) -&gt; TreeDiff</code>: Changes from the parents within <a href="../filesets/">the
<code>files</code> expression</a>. All files are compared by default, but it is
likely to change in future version to respect the command line path arguments.</li>
<li><code>.root() -&gt; Boolean</code>: True if the commit is the root commit.</li>
</ul>
<h3 id="commitid-changeid-type">CommitId / ChangeId type<a class="headerlink" href="#commitid-changeid-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.normal_hex() -&gt; String</code>: Normal hex representation (0-9a-f), useful for
ChangeId, whose canonical hex representation is "reversed" (z-k).</li>
<li><code>.short([len: Integer]) -&gt; String</code></li>
<li><code>.shortest([min_len: Integer]) -&gt; ShortestIdPrefix</code>: Shortest unique prefix.</li>
</ul>
<h3 id="commitref-type">CommitRef type<a class="headerlink" href="#commitref-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.name() -&gt; String</code>: Local bookmark or tag name.</li>
<li><code>.remote() -&gt; String</code>: Remote name or empty if this is a local ref.</li>
<li><code>.present() -&gt; Boolean</code>: True if the ref points to any commit.</li>
<li><code>.conflict() -&gt; Boolean</code>: True if <a href="../bookmarks/#conflicts">the bookmark or tag is
conflicted</a>.</li>
<li><code>.normal_target() -&gt; Option&lt;Commit&gt;</code>: Target commit if the ref is not
conflicted and points to a commit.</li>
<li><code>.removed_targets() -&gt; List&lt;Commit&gt;</code>: Old target commits if conflicted.</li>
<li><code>.added_targets() -&gt; List&lt;Commit&gt;</code>: New target commits. The list usually
contains one "normal" target.</li>
<li><code>.tracked() -&gt; Boolean</code>: True if the ref is tracked by a local ref. The local
ref might have been deleted (but not pushed yet.)</li>
<li><code>.tracking_present() -&gt; Boolean</code>: True if the ref is tracked by a local ref,
and if the local ref points to any commit.</li>
<li><code>.tracking_ahead_count() -&gt; SizeHint</code>: Number of commits ahead of the tracking
local ref.</li>
<li><code>.tracking_behind_count() -&gt; SizeHint</code>: Number of commits behind of the
tracking local ref.</li>
</ul>
<h3 id="configvalue-type">ConfigValue type<a class="headerlink" href="#configvalue-type" title="Permanent link">&para;</a></h3>
<p>This type can be printed in TOML syntax. The following methods are defined.</p>
<ul>
<li><code>.as_boolean() -&gt; Boolean</code>: Extract boolean.</li>
<li><code>.as_integer() -&gt; Integer</code>: Extract integer.</li>
<li><code>.as_string() -&gt; String</code>: Extract string. This does not convert non-string
value (e.g. integer) to string.</li>
<li><code>.as_string_list() -&gt; List&lt;String&gt;</code>: Extract list of strings.</li>
</ul>
<h3 id="cryptographicsignature-type">CryptographicSignature type<a class="headerlink" href="#cryptographicsignature-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.status() -&gt; String</code>: The signature's status (<code>"good"</code>, <code>"bad"</code>, <code>"unknown"</code>, <code>"invalid"</code>).</li>
<li><code>.key() -&gt; String</code>: The signature's key id representation (for GPG, this is the key fingerprint).</li>
<li><code>.display() -&gt; String</code>: The signature's display string (for GPG this is the formatted primary user ID).</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Calling any of <code>.status()</code>, <code>.key()</code>, or <code>.display()</code> is slow, as it incurs
the performance cost of verifying the signature (for example shelling out
to <code>gpg</code> or <code>ssh-keygen</code>). Though consecutive calls will be faster, because
the backend caches the verification result.</p>
</div>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>As opposed to calling any of <code>.status()</code>, <code>.key()</code>, or <code>.display()</code>,
checking for signature presence through boolean coercion is fast:
<div class="highlight"><pre><span></span><code>if(commit.signature(), &quot;commit has a signature&quot;, &quot;commit is unsigned&quot;)
</code></pre></div></p>
</div>
<h3 id="diffstats-type">DiffStats type<a class="headerlink" href="#diffstats-type" title="Permanent link">&para;</a></h3>
<p>This type can be printed as a histogram of the changes. The following methods
are defined.</p>
<ul>
<li><code>.total_added() -&gt; Integer</code>: Total number of insertions.</li>
<li><code>.total_removed() -&gt; Integer</code>: Total number of deletions.</li>
</ul>
<h3 id="email-type">Email type<a class="headerlink" href="#email-type" title="Permanent link">&para;</a></h3>
<p>The email field of a signature may or may not look like an email address. It may
be empty, may not contain the symbol <code>@</code>, and could in principle contain
multiple <code>@</code>s.</p>
<p>The following methods are defined.</p>
<ul>
<li><code>.local() -&gt; String</code>: the part of the email before the first <code>@</code>, usually the
username.</li>
<li><code>.domain() -&gt; String</code>: the part of the email after the first <code>@</code> or the empty
string.</li>
</ul>
<h3 id="integer-type">Integer type<a class="headerlink" href="#integer-type" title="Permanent link">&para;</a></h3>
<p>No methods are defined.</p>
<h3 id="list-type">List type<a class="headerlink" href="#list-type" title="Permanent link">&para;</a></h3>
<p>A list can be implicitly converted to <code>Boolean</code>. The following methods are
defined.</p>
<ul>
<li><code>.len() -&gt; Integer</code>: Number of elements in the list.</li>
<li><code>.join(separator: Template) -&gt; Template</code>: Concatenate elements with
the given <code>separator</code>.</li>
<li><code>.filter(|item| expression) -&gt; List</code>: Filter list elements by predicate
<code>expression</code>. Example: <code>description.lines().filter(|s| s.contains("#"))</code></li>
<li><code>.map(|item| expression) -&gt; ListTemplate</code>: Apply template <code>expression</code>
to each element. Example: <code>parents.map(|c| c.commit_id().short())</code></li>
</ul>
<h3 id="listtemplate-type">ListTemplate type<a class="headerlink" href="#listtemplate-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined. See also the <code>List</code> type.</p>
<ul>
<li><code>.join(separator: Template) -&gt; Template</code></li>
</ul>
<h3 id="operation-type">Operation type<a class="headerlink" href="#operation-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.current_operation() -&gt; Boolean</code></li>
<li><code>.description() -&gt; String</code></li>
<li><code>.id() -&gt; OperationId</code></li>
<li><code>.tags() -&gt; String</code></li>
<li><code>.time() -&gt; TimestampRange</code></li>
<li><code>.user() -&gt; String</code></li>
<li><code>.snapshot() -&gt; Boolean</code>: True if the operation is a snapshot operation.</li>
<li><code>.root() -&gt; Boolean</code>: True if the operation is the root operation.</li>
</ul>
<h3 id="operationid-type">OperationId type<a class="headerlink" href="#operationid-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.short([len: Integer]) -&gt; String</code></li>
</ul>
<h3 id="option-type">Option type<a class="headerlink" href="#option-type" title="Permanent link">&para;</a></h3>
<p>An option can be implicitly converted to <code>Boolean</code> denoting whether the
contained value is set. If set, all methods of the contained value can be
invoked. If not set, an error will be reported inline on method call.</p>
<h3 id="repopath-type">RepoPath type<a class="headerlink" href="#repopath-type" title="Permanent link">&para;</a></h3>
<p>A slash-separated path relative to the repository root. The following methods
are defined.</p>
<ul>
<li><code>.display() -&gt; String</code>: Format path for display. The formatted path uses
platform-native separator, and is relative to the current working directory.</li>
<li><code>.parent() -&gt; Option&lt;RepoPath&gt;</code>: Parent directory path.</li>
</ul>
<h3 id="shortestidprefix-type">ShortestIdPrefix type<a class="headerlink" href="#shortestidprefix-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.prefix() -&gt; String</code></li>
<li><code>.rest() -&gt; String</code></li>
<li><code>.upper() -&gt; ShortestIdPrefix</code></li>
<li><code>.lower() -&gt; ShortestIdPrefix</code></li>
</ul>
<h3 id="signature-type">Signature type<a class="headerlink" href="#signature-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.name() -&gt; String</code></li>
<li><code>.email() -&gt; Email</code></li>
<li><code>.timestamp() -&gt; Timestamp</code></li>
</ul>
<h3 id="sizehint-type">SizeHint type<a class="headerlink" href="#sizehint-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.lower() -&gt; Integer</code>: Lower bound.</li>
<li><code>.upper() -&gt; Option&lt;Integer&gt;</code>: Upper bound if known.</li>
<li><code>.exact() -&gt; Option&lt;Integer&gt;</code>: Exact value if upper bound is known and it
equals to the lower bound.</li>
<li><code>.zero() -&gt; Boolean</code>: True if upper bound is known and is <code>0</code>.</li>
</ul>
<h3 id="string-type">String type<a class="headerlink" href="#string-type" title="Permanent link">&para;</a></h3>
<p>A string can be implicitly converted to <code>Boolean</code>. The following methods are
defined.</p>
<ul>
<li><code>.len() -&gt; Integer</code>: Length in UTF-8 bytes.</li>
<li><code>.contains(needle: Template) -&gt; Boolean</code></li>
<li><code>.first_line() -&gt; String</code></li>
<li><code>.lines() -&gt; List&lt;String&gt;</code>: Split into lines excluding newline characters.</li>
<li><code>.upper() -&gt; String</code></li>
<li><code>.lower() -&gt; String</code></li>
<li><code>.starts_with(needle: Template) -&gt; Boolean</code></li>
<li><code>.ends_with(needle: Template) -&gt; Boolean</code></li>
<li><code>.remove_prefix(needle: Template) -&gt; String</code>: Removes the passed prefix, if present</li>
<li><code>.remove_suffix(needle: Template) -&gt; String</code>: Removes the passed suffix, if present</li>
<li><code>.trim() -&gt; String</code>: Removes leading and trailing whitespace</li>
<li><code>.trim_start() -&gt; String</code>: Removes leading whitespace</li>
<li><code>.trim_end() -&gt; String</code>: Removes trailing whitespace</li>
<li><code>.substr(start: Integer, end: Integer) -&gt; String</code>: Extract substring. The
<code>start</code>/<code>end</code> indices should be specified in UTF-8 bytes. Negative values
count from the end of the string.</li>
<li><code>.escape_json() -&gt; String</code>: Serializes the string in JSON format. This
function is useful for making machine-readable templates. For example, you
can use it in a template like <code>'{ "foo": ' ++ foo.escape_json() ++ ' }'</code> to
return a JSON/JSONL.</li>
</ul>
<h4 id="string-literals">String literals<a class="headerlink" href="#string-literals" title="Permanent link">&para;</a></h4>
<p>String literals must be surrounded by single or double quotes (<code>'</code> or <code>"</code>).
A double-quoted string literal supports the following escape sequences:</p>
<ul>
<li><code>\"</code>: double quote</li>
<li><code>\\</code>: backslash</li>
<li><code>\t</code>: horizontal tab</li>
<li><code>\r</code>: carriage return</li>
<li><code>\n</code>: new line</li>
<li><code>\0</code>: null</li>
<li><code>\e</code>: escape (i.e., <code>\x1b</code>)</li>
<li><code>\xHH</code>: byte with hex value <code>HH</code></li>
</ul>
<p>Other escape sequences are not supported. Any UTF-8 characters are allowed
inside a string literal, with two exceptions: unescaped <code>"</code>-s and uses of <code>\</code>
that don't form a valid escape sequence.</p>
<p>A single-quoted string literal has no escape syntax. <code>'</code> can't be expressed
inside a single-quoted string literal.</p>
<h3 id="template-type">Template type<a class="headerlink" href="#template-type" title="Permanent link">&para;</a></h3>
<p>Most types can be implicitly converted to <code>Template</code>. No methods are defined.</p>
<h3 id="timestamp-type">Timestamp type<a class="headerlink" href="#timestamp-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.ago() -&gt; String</code>: Format as relative timestamp.</li>
<li><code>.format(format: String) -&gt; String</code>: Format with <a href="https://docs.rs/chrono/latest/chrono/format/strftime/">the specified strftime-like
format string</a>.</li>
<li><code>.utc() -&gt; Timestamp</code>: Convert timestamp into UTC timezone.</li>
<li><code>.local() -&gt; Timestamp</code>: Convert timestamp into local timezone.</li>
<li><code>.after(date: String) -&gt; Boolean</code>: True if the timestamp is exactly at or after the given date.</li>
<li><code>.before(date: String) -&gt; Boolean</code>: True if the timestamp is before, but not including, the given date.</li>
</ul>
<h3 id="timestamprange-type">TimestampRange type<a class="headerlink" href="#timestamprange-type" title="Permanent link">&para;</a></h3>
<p>The following methods are defined.</p>
<ul>
<li><code>.start() -&gt; Timestamp</code></li>
<li><code>.end() -&gt; Timestamp</code></li>
<li><code>.duration() -&gt; String</code></li>
</ul>
<h3 id="treediff-type">TreeDiff type<a class="headerlink" href="#treediff-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.files() -&gt; List&lt;TreeDiffEntry&gt;</code>: Changed files.</li>
<li><code>.color_words([context: Integer]) -&gt; Template</code>: Format as a word-level diff
with changes indicated only by color.</li>
<li><code>.git([context: Integer]) -&gt; Template</code>: Format as a Git diff.</li>
<li><code>.stat([width: Integer]) -&gt; DiffStats</code>: Calculate stats of changed lines.</li>
<li><code>.summary() -&gt; Template</code>: Format as a list of status code and path pairs.</li>
</ul>
<h3 id="treediffentry-type">TreeDiffEntry type<a class="headerlink" href="#treediffentry-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.path() -&gt; RepoPath</code>: Path to the entry. If the entry is a copy/rename, this
points to the target (or right) entry.</li>
<li><code>.status() -&gt; String</code>: One of <code>"modified"</code>, <code>"added"</code>, <code>"removed"</code>,
<code>"copied"</code>, or <code>"renamed"</code>.</li>
<li><code>.source() -&gt; TreeEntry</code>: The source (or left) entry.</li>
<li><code>.target() -&gt; TreeEntry</code>: The target (or right) entry.</li>
</ul>
<h3 id="treeentry-type">TreeEntry type<a class="headerlink" href="#treeentry-type" title="Permanent link">&para;</a></h3>
<p>This type cannot be printed. The following methods are defined.</p>
<ul>
<li><code>.path() -&gt; RepoPath</code>: Path to the entry.</li>
<li><code>.conflict() -&gt; Boolean</code>: True if the entry is a merge conflict.</li>
<li><code>.file_type() -&gt; String</code>: One of <code>"file"</code>, <code>"symlink"</code>, <code>"tree"</code>,
<code>"git-submodule"</code>, or <code>"conflict"</code>.</li>
<li><code>.executable() -&gt; Boolean</code>: True if the entry is an executable file.</li>
</ul>
<h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h2>
<p>The default templates and aliases() are defined in the <code>[templates]</code> and
<code>[template-aliases]</code> sections of the config respectively. The exact definitions
can be seen in the <a href="https://github.com/jj-vcs/jj/blob/main/cli/src/config/templates.toml"><code>cli/src/config/templates.toml</code></a> file in jj's source
tree.</p>
<!--- TODO: Find a way to embed the default config files in the docs -->
<p>New keywords and functions can be defined as aliases, by using any
combination of the predefined keywords/functions and other aliases.</p>
<p>Alias functions can be overloaded by the number of parameters. However, builtin
functions will be shadowed by name, and can't co-exist with aliases.</p>
<p>For example:</p>
<div class="highlight"><pre><span></span><code><span class="k">[template-aliases]</span>
<span class="s1">&#39;commit_change_ids&#39;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;&#39;&#39;</span>
<span class="s1">concat(</span>
<span class="s1"> format_field(&quot;Commit ID&quot;, commit_id),</span>
<span class="s1"> format_field(&quot;Change ID&quot;, change_id),</span>
<span class="s1">)</span>
<span class="s1">&#39;&#39;&#39;</span>
<span class="s1">&#39;format_field(key, value)&#39;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;key ++ &quot;: &quot; ++ value ++ &quot;\n&quot;&#39;</span>
</code></pre></div>
<h2 id="examples">Examples<a class="headerlink" href="#examples" title="Permanent link">&para;</a></h2>
<p>Get short commit IDs of the working-copy parents:</p>
<div class="highlight"><pre><span></span><code>jj<span class="w"> </span>log<span class="w"> </span>--no-graph<span class="w"> </span>-r<span class="w"> </span>@<span class="w"> </span>-T<span class="w"> </span><span class="s1">&#39;parents.map(|c| c.commit_id().short()).join(&quot;,&quot;)&#39;</span>
</code></pre></div>
<p>Show machine-readable list of full commit and change IDs:</p>
<div class="highlight"><pre><span></span><code>jj<span class="w"> </span>log<span class="w"> </span>--no-graph<span class="w"> </span>-T<span class="w"> </span><span class="s1">&#39;commit_id ++ &quot; &quot; ++ change_id ++ &quot;\n&quot;&#39;</span>
</code></pre></div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": [], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"alias": true, "provider": "mike"}}</script>
<script src="../assets/javascripts/bundle.f1b6f286.min.js"></script>
</body>
</html>