The old surrounding-sexp procedure would read all S-expressions from the
beginning of the file up to the given line number and then return the last
encountered S-expression. This is quite wasteful. Instead we can record all
lines that begin with an S-expression and jump straight to the offset closest
to the desired line number to read the S-expression there.
* etc/committer.scm.in (lines+offsets-with-opening-parens): New procedure.
(surrounding-sexp): Use it.
* etc/committer.scm.in (%original-file-cache): New variable.
(read-original-file): New procedure.
(read-original-file*): New procedure.
(old-sexp): Use it.
* etc/committer.scm.in (hunk-types): New variable.
(<hunk>): Rename hunk-definition? getter to 'hunk-type'.
(diff-info): Mute a git warning by separating file names from arguments with
'--'. Rename the 'definitions?' variable to 'type'.
Use the 'addition type when a new package addition is detected, 'removal when
removed else #f.
(add-commit-message): Re-indent.
(remove-commit-message): New procedure.
(main)[definitions]: Make commit message conditional depending on whether it
is an addition or removal.
[changes]: Adjust indentation.
This avoids a naming conflict for 'filter', provided by both (srfi srfi-1)
and (sxml xpath).
* etc/committer.scm.in: Use 'use-modules' instead of 'import', and use a
prefix for the (sxml xpath) module.
(new-sexp): Adjust accordingly.
(change-commit-message): Likewise.
Previously, the script would raise an error if a copyright line was added to a
file in gnu/packages/. With this change, it will amend the previous commit
whenever a copyright line is added, and add the copyright line to the commit.
* etc/committer.scm.in (add-copyright-line): New procedure.
(main): Check if a copyright line was added and call ‘add-copyright-line’ if
necessary.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Allow custom change commit messages by supplying a commit message and
optionally a changelog message as arguments.
* etc/committer.scm.in (break-string-with-newlines)
(custom-commit-message): New procedures.
(main)[change-commit-message*]: New sub-procedure. Use them.
(main): Use it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Some package definitions use G-expressions (see, e.g., chez-scheme).
Import (guix gexp) such that Guile knows how to read those.
Otherwise, an exception such as the following might be raised:
ERROR: In procedure read:
In procedure scm_lreadr: gnu/services/networking.scm:480:16: Unknown # object: #\~
* etc/committer.scm.in: Import (guix gexp).
Signed-off-by: Ricardo Wurmus <rekado@elephly.net>
With zero context new definitions would be applied to the wrong location in
the file. More context lines lead to larger hunks, though, so we use just one
line of context.
* etc/committer.scm.in (diff-info): Invoke "git diff" with one line of
context.
[info]: Merge line break and first line.
(lines-to-first-change): New procedure.
(old-sexp, new-sexp): Use it.
* etc/committer.scm.in (<hunk>)[diff]: Rename this field...
[diff-lines]: ...to this.
[definition?]: New field.
(hunk->patch): Join diff lines.
(diff-info): Do not join diff lines; record whether a hunk is a new
definition.
(commit-message): Rename this procedure...
(change-commit-message): ...to this.
(add-commit-message): New procedure.
(main): Handle new package definitions before changes.
* etc/committer.scm.in (commit-message): Use EQUAL? instead of EQ? to compute
differences because not all inputs may be symbols; some could be expressions.