Emacs: c'è un modo per generare un ChangeLog scheletro da diff?
-
05-07-2019 - |
Domanda
Vorrei automatizzare parzialmente la creazione di voci ChangeLog in stile GNU quando si lavora con il codice sorgente nel controllo versione. aggiungi-changelog-entry-other-window
funziona con un file alla volta e devi visitare il file per usarlo.
Quello che mi piacerebbe vedere invece è avere un comando che avrebbe un output di diff -u -p
(o avere l'integrazione con le modalità VC in modo che possa elaborare svn diff
ecc.) e per creare tutte le voci di scheletro contemporaneamente.
Ad esempio, se svn status
mostra
D file1.c
M file2.c
A file3.c
il comando creerebbe
2009-09-05 My Name <my.email>
* file1.c: Removed.
* file2.c: WRITE YOUR CHANGES HERE
* file3.c: New.
Meglio ancora, se fosse in grado di analizzare i file modificati in alcune lingue in modo da poter offrire:
* file2.c (new_function): New function.
(deleted_function): Removed.
(changed_function): WRITE YOUR CHANGES HERE
Ho trovato questa funzione nel manuale di Emacs , ma non vedo come potrei applicarlo qui.
Qualche suggerimento? Grazie.
EDIT: una risposta suggerita VC-update-change-log . Sfortunatamente supporta solo CVS e crea voci ChangeLog interrogando i log VC già sottoposti a commit. Pertanto, anche se supportasse svn e altri, sarebbe impossibile eseguire il commit delle modifiche e del ChangeLog nello stesso commit.
EDIT2: Apparentemente add-changelog-entry-other-window (C-x 4 a) funziona non solo dal file visitato, ma anche dal diff hunk che coinvolge quel file. ( Fonte ) Questo è quasi ciò che sto cercando. Questo, insieme al ciclo elisp, per iterare attraverso tutti gli hunk, dovrebbe risolverlo.
Soluzione
Non conosco una funzione che lo fa, ma dovrebbe essere facile da implementare. Fondamentalmente, vuoi
- ottieni i file modificati
- per ogni file, chiama
aggiungi-cambia-registro
"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."
quindi il codice magico apparirà simile a
(apply 'make-magic-change-log-entry changed-files-list)
e make-magic-change-log-entry
elimina semplicemente la funzione aggiungi-cambia-log
in modo che l'unico argomento sia nome-file : imposti gli altri.
Altri suggerimenti
Esiste una funzione < code> vc-update-change-log che genera automaticamente voci del registro delle modifiche dalle voci del registro di controllo della versione.
diff-add-change-log-entry-other-window
è documentato per fare esattamente ciò che hai menzionato in EDIT2:
diff-add-change-log-entries-other-window is an interactive compiled
Lisp function in `diff-mode.el'.
(diff-add-change-log-entries-other-window)
Iterate through the current diff and create ChangeLog entries.
I.e. like `add-change-log-entry-other-window' but applied to all hunks.
Sfortunatamente, non funziona molto bene per, diciamo, per i nuovi file: non include nemmeno i nomi dei file di tali file nella voce del log delle modifiche scheletrico.
Potresti avere più fortuna con lo script mklog di gcc, che puoi ottenere da http :. //gcc.gnu.org/viewcvs/gcc/trunk/contrib/mklog
Ho scritto una funzione per fare qualcosa di simile a quello di cui stavi parlando. Puoi ottenere il codice su http://www.emacswiki.org/emacs/log- edit-riempimento