views:

286

answers:

3

I'd like to partly automate creation of GNU-style ChangeLog entries when working with source code in version control. The add-changelog-entry-other-window works with one file at a time and you have to visit the file to use it.

What I'd like to see instead is to have some command that would take an output of diff -u -p (or have integration with VC modes so it could process svn diff etc) and to create all the skeleton entries at once.

For example, if svn status shows

D file1.c
M file2.c
A file3.c

the command would create

2009-09-05  My Name <my.email>

      * file1.c: Removed.
      * file2.c: WRITE YOUR CHANGES HERE
      * file3.c: New.

Better yet, if it could parse the changed files in some languages to an extent so it could offer:

  * file2.c (new_function): New function.
  (deleted_function): Removed.
  (changed_function): WRITE YOUR CHANGES HERE

I have found this feature in Emacs manual, but I don't see how I could apply it here.

Any suggestions? Thanks.

EDIT: One answer suggested vc-update-change-log. Unfortunately it only supports CVS and it creates ChangeLog entries by querying the already-commited VC logs. Thus even if it supported svn and others, it would be impossible to commit the changes and the ChangeLog in the same commit.

EDIT2: Apparently add-changelog-entry-other-window (C-x 4 a) works not only from visited file but from diff hunk involving that file too. (Source) This is almost what I am looking for. This together with elisp loop to iterate through all hunks should solve it.

+2  A: 

I don't know of a function that does this, but it should be easy to implement. Basically, you want to

  • get the changed files
  • for each file, call add-change-log
"Find change log file, and add an entry for today and an item for this file.
Optional arg WHOAMI (interactive prefix) non-nil means prompt for user
name and email (stored in `add-log-full-name' and `add-log-mailing-address').

Second arg FILE-NAME is file name of the change log.
If nil, use the value of `change-log-default-name'.

Third arg OTHER-WINDOW non-nil means visit in other window.

Fourth arg NEW-ENTRY non-nil means always create a new entry at the front;
never append to an existing entry.  Option `add-log-keep-changes-together'
otherwise affects whether a new entry is created.

Option `add-log-always-start-new-record' non-nil means always create a
new record, even when the last record was made on the same date and by
the same person.

The change log file can start with a copyright notice and a copying
permission notice.  The first blank line indicates the end of these
notices.

Today's date is calculated according to `add-log-time-zone-rule' if
non-nil, otherwise in local time."

so the magic code is going to look something like

(apply 'make-magic-change-log-entry changed-files-list)

and make-magic-change-log-entry simply curries the add-change-log function so that the only argument is file-name — you set the other ones.

Charlie Martin
Thanks. I guess this will exclude deleted and added files?
Laurynas Biveinis
Depends o how you generate that changed-files-list. Lots of things you could do, like having the list be a list of cons pairs (an "alist") like ("added" . "filename"). If you want to do much magic, you might make a new customized add-change-log-entry with an argument for whatever other stuff you want. the thing to do is read the add-log.el code.
Charlie Martin
+3  A: 

There is a function vc-update-change-log that automatically generates change log entries from the version control log entries.

Török Gábor
Sorry, this is not what I am looking for. First, it only supports CVS. Even if it supported other VC systems, it creates ChangeLog entries from VC log entries, meaning that the changed files are already commited. Sure that's fine with CVS, but with any 21st century version control system i'd like to commit the ChangeLog in the same changeset as the changed files themselves.
Laurynas Biveinis
You're right, I didn't check that neither psvn or git/magit implemented this feature, sorry about that.
Török Gábor
+1  A: 

I've written a function to do something similar to what you were talking about. You can get the code at http://www.emacswiki.org/emacs/log-edit-fill

Thanks! Finally I got around trying it. How do I actually use it? If I try to invoke in svn-log-edit buffer, I get Symbol's function definition is void: log-edit-show-diff. Also, my question concerned about filling the ChangeLog file before the actual commit, is there a way to use log-edit-fill in that way?
Laurynas Biveinis