Merge branch 'cc/pretty-contents-size' into master
"git for-each-ref --format=<>" learned %(contents:size). * cc/pretty-contents-size: ref-filter: add support for %(contents:size) t6300: test refs pointing to tree and blob Documentation: clarify %(contents:XXXX) docmaint
commit
be537062af
|
@ -232,12 +232,27 @@ Fields that have name-email-date tuple as its value (`author`,
|
||||||
`committer`, and `tagger`) can be suffixed with `name`, `email`,
|
`committer`, and `tagger`) can be suffixed with `name`, `email`,
|
||||||
and `date` to extract the named component.
|
and `date` to extract the named component.
|
||||||
|
|
||||||
The complete message in a commit and tag object is `contents`.
|
The message in a commit or a tag object is `contents`, from which
|
||||||
Its first line is `contents:subject`, where subject is the concatenation
|
`contents:<part>` can be used to extract various parts out of:
|
||||||
of all lines of the commit message up to the first blank line. The next
|
|
||||||
line is `contents:body`, where body is all of the lines after the first
|
contents:size::
|
||||||
blank line. The optional GPG signature is `contents:signature`. The
|
The size in bytes of the commit or tag message.
|
||||||
first `N` lines of the message is obtained using `contents:lines=N`.
|
|
||||||
|
contents:subject::
|
||||||
|
The first paragraph of the message, which typically is a
|
||||||
|
single line, is taken as the "subject" of the commit or the
|
||||||
|
tag message.
|
||||||
|
|
||||||
|
contents:body::
|
||||||
|
The remainder of the commit or the tag message that follows
|
||||||
|
the "subject".
|
||||||
|
|
||||||
|
contents:signature::
|
||||||
|
The optional GPG signature of the tag.
|
||||||
|
|
||||||
|
contents:lines=N::
|
||||||
|
The first `N` lines of the message.
|
||||||
|
|
||||||
Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
|
Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
|
||||||
are obtained as `trailers` (or by using the historical alias
|
are obtained as `trailers` (or by using the historical alias
|
||||||
`contents:trailers`). Non-trailer lines from the trailer block can be omitted
|
`contents:trailers`). Non-trailer lines from the trailer block can be omitted
|
||||||
|
|
|
@ -127,7 +127,8 @@ static struct used_atom {
|
||||||
unsigned int nobracket : 1, push : 1, push_remote : 1;
|
unsigned int nobracket : 1, push : 1, push_remote : 1;
|
||||||
} remote_ref;
|
} remote_ref;
|
||||||
struct {
|
struct {
|
||||||
enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
|
enum { C_BARE, C_BODY, C_BODY_DEP, C_LENGTH,
|
||||||
|
C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
|
||||||
struct process_trailer_options trailer_opts;
|
struct process_trailer_options trailer_opts;
|
||||||
unsigned int nlines;
|
unsigned int nlines;
|
||||||
} contents;
|
} contents;
|
||||||
|
@ -338,6 +339,8 @@ static int contents_atom_parser(const struct ref_format *format, struct used_ato
|
||||||
atom->u.contents.option = C_BARE;
|
atom->u.contents.option = C_BARE;
|
||||||
else if (!strcmp(arg, "body"))
|
else if (!strcmp(arg, "body"))
|
||||||
atom->u.contents.option = C_BODY;
|
atom->u.contents.option = C_BODY;
|
||||||
|
else if (!strcmp(arg, "size"))
|
||||||
|
atom->u.contents.option = C_LENGTH;
|
||||||
else if (!strcmp(arg, "signature"))
|
else if (!strcmp(arg, "signature"))
|
||||||
atom->u.contents.option = C_SIG;
|
atom->u.contents.option = C_SIG;
|
||||||
else if (!strcmp(arg, "subject"))
|
else if (!strcmp(arg, "subject"))
|
||||||
|
@ -1253,6 +1256,8 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
|
||||||
v->s = copy_subject(subpos, sublen);
|
v->s = copy_subject(subpos, sublen);
|
||||||
else if (atom->u.contents.option == C_BODY_DEP)
|
else if (atom->u.contents.option == C_BODY_DEP)
|
||||||
v->s = xmemdupz(bodypos, bodylen);
|
v->s = xmemdupz(bodypos, bodylen);
|
||||||
|
else if (atom->u.contents.option == C_LENGTH)
|
||||||
|
v->s = xstrfmt("%"PRIuMAX, (uintmax_t)strlen(subpos));
|
||||||
else if (atom->u.contents.option == C_BODY)
|
else if (atom->u.contents.option == C_BODY)
|
||||||
v->s = xmemdupz(bodypos, nonsiglen);
|
v->s = xmemdupz(bodypos, nonsiglen);
|
||||||
else if (atom->u.contents.option == C_SIG)
|
else if (atom->u.contents.option == C_SIG)
|
||||||
|
|
|
@ -52,6 +52,25 @@ test_atom() {
|
||||||
sanitize_pgp <actual >actual.clean &&
|
sanitize_pgp <actual >actual.clean &&
|
||||||
test_cmp expected actual.clean
|
test_cmp expected actual.clean
|
||||||
"
|
"
|
||||||
|
# Automatically test "contents:size" atom after testing "contents"
|
||||||
|
if test "$2" = "contents"
|
||||||
|
then
|
||||||
|
case $(git cat-file -t "$ref") in
|
||||||
|
tag)
|
||||||
|
# We cannot use $3 as it expects sanitize_pgp to run
|
||||||
|
expect=$(git cat-file tag $ref | tail -n +6 | wc -c) ;;
|
||||||
|
tree | blob)
|
||||||
|
expect='' ;;
|
||||||
|
commit)
|
||||||
|
expect=$(printf '%s' "$3" | wc -c) ;;
|
||||||
|
esac
|
||||||
|
# Leave $expect unquoted to lose possible leading whitespaces
|
||||||
|
echo $expect >expected
|
||||||
|
test_expect_${4:-sucess} $PREREQ "basic atom: $1 contents:size" '
|
||||||
|
git for-each-ref --format="%(contents:size)" "$ref" >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
hexlen=$(test_oid hexsz)
|
hexlen=$(test_oid hexsz)
|
||||||
|
@ -650,6 +669,25 @@ test_atom refs/tags/signed-long contents "subject line
|
||||||
body contents
|
body contents
|
||||||
$sig"
|
$sig"
|
||||||
|
|
||||||
|
test_expect_success 'set up refs pointing to tree and blob' '
|
||||||
|
git update-ref refs/mytrees/first refs/heads/master^{tree} &&
|
||||||
|
git update-ref refs/myblobs/first refs/heads/master:one
|
||||||
|
'
|
||||||
|
|
||||||
|
test_atom refs/mytrees/first subject ""
|
||||||
|
test_atom refs/mytrees/first contents:subject ""
|
||||||
|
test_atom refs/mytrees/first body ""
|
||||||
|
test_atom refs/mytrees/first contents:body ""
|
||||||
|
test_atom refs/mytrees/first contents:signature ""
|
||||||
|
test_atom refs/mytrees/first contents ""
|
||||||
|
|
||||||
|
test_atom refs/myblobs/first subject ""
|
||||||
|
test_atom refs/myblobs/first contents:subject ""
|
||||||
|
test_atom refs/myblobs/first body ""
|
||||||
|
test_atom refs/myblobs/first contents:body ""
|
||||||
|
test_atom refs/myblobs/first contents:signature ""
|
||||||
|
test_atom refs/myblobs/first contents ""
|
||||||
|
|
||||||
test_expect_success 'set up multiple-sort tags' '
|
test_expect_success 'set up multiple-sort tags' '
|
||||||
for when in 100000 200000
|
for when in 100000 200000
|
||||||
do
|
do
|
||||||
|
|
Loading…
Reference in New Issue