libra format-patch
Command reference for `libra format-patch`
Generate mbox-formatted email patch files from commits.
Synopsis
libra format-patch [OPTIONS] [revision-range]
Description
libra format-patch walks a revision range (A..B or a single commit treated
as <commit>..HEAD), produces one patch file per non-merge commit (named with
the --suffix, default .patch, unless --numbered-files is set, which uses
bare sequence numbers), and
formats each as an mbox message with RFC 2822 headers, a plain-text diffstat,
and a unified diff. The output is compatible with git am.
Merge commits are skipped by default. When the revision range resolves to zero commits, the command exits with an error.
Options
| Flag | Short | Description | Default |
|---|---|---|---|
[revision-range] |
A..B range or single commit; single commit means <commit>..HEAD |
HEAD |
|
--output-directory <DIR> |
-o |
Write patch files into DIR |
current directory |
--stdout |
Print all patches to stdout | false | |
--numbered |
-n |
Name files with a leading sequence number (0001-subject.patch) |
false |
--start-number <N> |
Start numbering at N |
1 | |
--subject-prefix <PREFIX> |
Use PREFIX instead of PATCH in the Subject: line |
PATCH |
|
--cover-letter |
Generate a cover-letter template (0000-cover-letter<suffix>, or 0 under --numbered-files) |
false | |
--thread |
Add In-Reply-To and References headers (default on) |
true | |
--no-thread |
Disable threading headers | false | |
--in-reply-to <MESSAGE_ID> |
Make the first mail a reply to the given Message-ID | none | |
--to <ADDRESS> |
Add a To: header (repeatable; multiple addresses fold like git). Placed after the MIME headers, on each patch and the cover letter |
none | |
--cc <ADDRESS> |
Add a Cc: header (repeatable; folds like git) |
none | |
--no-to / --no-cc |
Suppress the To: / Cc: headers (Libra has no format.to/format.cc config to reset) |
false | |
--from[=<IDENT>] |
Use <IDENT> in the From: header instead of the commit author (bare --from uses the committer's configured identity). When it differs from the author, the original author is preserved as an in-body From: line so git am can restore it |
author | |
--reroll-count <N> |
-v |
Mark as version N (changes [PATCH] to [PATCH vN]) |
none |
--signoff |
-s |
Append a Signed-off-by trailer to each commit message |
false |
--notes[=<REF>] |
Append each commit's notes after the --- line, before the diffstat. Bare --notes uses the default ref (refs/notes/commits); --notes=<ref> reads <ref>. Rendered as Notes: (default ref) or Notes (<ref>):, each line indented four spaces; commits without a note are emitted unchanged |
off | |
--attach |
Emit each patch as a multipart/mixed MIME message: the log message + diffstat in a text/plain part, the diff in a text/x-patch part with Content-Disposition: attachment. Mutually exclusive with --inline |
off | |
--inline |
Like --attach, but the patch part uses Content-Disposition: inline |
off | |
--base <COMMIT> |
Record a base-commit: trailer (and a prerequisite-patch-id: line for each non-merge commit between the base and the series, oldest-first) so git am --base can verify the series applies. The trailer rides on the last patch, or the cover letter under --cover-letter. The base must be an ancestor of the series (otherwise exit 128). --base=auto is not supported (exit 129). Patch-ids match git patch-id --stable for text diffs; binary-file prerequisites are not guaranteed to match Git |
off | |
--full-index |
Show full object IDs in diff index header lines | false | |
--no-stat |
Suppress the diffstat summary | false | |
--keep-subject |
Keep the original [PATCH] prefix in the commit subject |
false | |
--suffix <SFX> |
Filename suffix for generated patches (e.g. .txt); ignored under --numbered-files |
.patch |
|
--zero-commit |
Use an all-zero hash in each patch's From <hash> envelope line |
false | |
--signature <SIGNATURE> |
Text placed after the -- line of each patch and the cover letter |
libra version | |
--no-signature |
Omit the -- /signature footer entirely |
false | |
--signature-file <FILE> |
Read the signature footer text from a file (mutually exclusive with --signature) |
||
--encode-email-headers / --no-encode-email-headers |
RFC 2047 Q-encode From/Subject header values that contain non-ASCII characters |
off | |
--numbered-files |
Name output files by a bare sequence number (suffix not applied) | false |
Examples
Basic range
# Generate patches for the last three commits
libra format-patch HEAD~3..HEAD
# Numbered patches in a directory
libra format-patch -n -o patches/ main..feature
# With cover letter and threading
libra format-patch --cover-letter --thread origin/main..
# Version 2, replying to a previous thread
libra format-patch -v 2 --in-reply-to '<msgid@example>' origin/main..
# Pipe to an external tool
libra format-patch --stdout origin/main.. | git am
# Record the base the series applies to (for `git am --base`)
libra format-patch --base=origin/main --stdout origin/main..HEAD
Output Format
Each patch file is an mbox message:
From <commit-oid> <unix-mbox-date>
From: Author Name <email>
Date: <RFC 2822 date>
Subject: [PATCH n/m] commit subject
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
commit message body
---
diffstat summary
unified diff
--
<libra-version>
The -- footer defaults to the libra version; --signature <text> replaces
it with custom text, --signature-file <file> reads the footer text from a
file, and --no-signature omits the footer entirely. --encode-email-headers
RFC 2047 Q-encodes From/Subject header values that contain non-ASCII
characters. It is off by default in Libra (which has no format.encodeEmailHeaders
config knob); Git derives its default from that config, which is itself off
unless set.
With --json or --machine, data.patches lists every generated output.
When --cover-letter is set, the list includes the cover letter as record
number 0 before the commit patch records. Its filename is
0000-cover-letter with the configured suffix (default .patch), or just 0
under --numbered-files.
Error Handling
| Scenario | StableErrorCode |
|---|---|
| Not in a Libra repository | LBR-REPO-001 |
| Unknown revision or empty range | LBR-CLI-003 |
--base is not an ancestor of the series |
LBR-CLI-003 (exit 128) |
--base=auto (unsupported) |
LBR-CLI-002 (exit 129) |
| Output file write failure | LBR-IO-002 |
| Output directory creation failure | LBR-IO-002 |