From 6281db4c82900528c483089a10bbe96e3d9c9907 Mon Sep 17 00:00:00 2001 From: Hugo Villeneuve Date: Tue, 14 Jan 2014 22:53:08 -0500 Subject: [PATCH] ChangeLog is now automatically generated from git log output --- ChangeLog | 490 ---------------------------------- Makefile.am | 14 +- autogen.sh | 3 + build-aux/gitlog-to-changelog | 432 ++++++++++++++++++++++++++++++ 4 files changed, 448 insertions(+), 491 deletions(-) delete mode 100644 ChangeLog create mode 100755 build-aux/gitlog-to-changelog diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index e699866..0000000 --- a/ChangeLog +++ /dev/null @@ -1,490 +0,0 @@ -2013-09-07 Hugo Villeneuve - * Fix compiler warnings - * Fix error with CJNE instruction. - Error report and patch submission by Tobias Diedrich - (ranma at tdiedrich.de). - -2011-12-11 Hugo Villeneuve - * Added optional size parameter when dumping memory. - * Created two separate executables, emu8051-cli (default) - and optional emu8051-gtk if Gtk+ is detected. - -2011-10-29 Hugo Villeneuve - * Fixed SJMP error and improved columns and rows sizing. - Error reported and patch submitted by Pierre Ferrari - (piferr4ri at gmail.com). - -2010-03-19 Hugo Villeneuve - * Reintroduced the console mode if no GTK+ librairies are - detected. The default is to build the GUI if GTK+ is detected, - but the console mode can always be forced by using - "--enable-gui=no" as a configure option. - -2009-02-09 Hugo Villeneuve - * Updated Free Software Foundation address. - -2008-11-05 Hugo Villeneuve - * Added licencing informations for each source file. - * Removed some debugging messages. - -2008-04-28 Hugo Villeneuve - * Removed gtk+-1.0 support, now requires gtk+-2 - -2004-05-07 Hugo Villeneuve - * Corrected a bug with the CJNE instruction. - * Modified the directory layout and autoconf files. - * Added support for GTK2. - * Added project to subversion. - -2002-11-12 Hugo Villeneuve - * Removed some warnings for GCC 3.2: replaced by - and by . - * Added "using namespace std;" in EmuGtk.hpp (for GCC 3.2) - * Removed all unused variables - * Corrected error in CPU8051.cpp, in function: - 'void CPU8051::IntMemBitInfo( unsigned int BitAddress, char *Text )' - Modified this: - 'sprintf( &Text[ TextLength ], ".%X", BitAddress );' - instead of: - 'sprintf( &Text[ TextLength ], ".%X" );' - * In Opcode2cpp.pl (line 767), modified for GCC 3.2: - 'print INST_IMP " funcptr[$i]=&CPU8051::$ifunc;\n";' - instead of: - 'print INST_IMP " funcptr[$i]=&$ifunc;\n";' - * EmuGtk.cpp, added '#include ' - * Modified the return type of some functions to void to remove warnings. - * In function 'void RegWin::Show( CPU8051 *CPU )' (RegWin.cpp), removed all - the '\n' in 'gtk_clist_set_text' calls (to fix a display problem) - -1999-04-27 Hugo Villeneuve - * Ajoute les fonctions DumpInt dans EmuConsole.hpp ainsi que ReadInt - dans CPU8051.hpp. Corrige des bugs dans WriteInt et WriteExt. - - * Corrige l'implementation des timers. Les 4 modes ont ete testes et - semblent bien fonctionner maintenant. LEs flags sont mis correctement - et les timers augmentent maintenant (au lieu d'etre decrementes). - * Ajoute un fichier timer.hex pour tester les timers. - -1999-04-22 Hugo Villeneuve - * Ajoute les fonctions ME, MI et MP (voir definitions dans - EmuConsole.cpp). Ajoute les fonctions membres WriteExt et WriteInt - dans la classe CPU8051 afin de suivre la logique de l'espace - memoire du 8051. WriteExt permet de modifier la memoire externe - qui va de $00 a $FFFF (et non de $100 a $FFFF comme c'etait le cas - avant). De meme, WriteInt permet de modifier la memoire interne qui - va de $00 a $FF (incluant les SFR). Meme si la memoire externe - contient les adresses $00 a $FF, il n'y a pas de conflit avec la - memoire interne de $00 a $FF car la memoire externe est accedee avec - l'instruction MOVX alors que la memoire interne l'est avec les - instructions MOV (direct ou indirect). - - * Renomme l'option DD du menu pour DE (dump External data memory). - Change la description de l'option DI du menu pour Dump External - Data Memory. - - * Ajoute la fonction ReadExt dans la classe CPU8051, toujours pour - la logique de la memoire du 8051. Ajoute la fonction DumpExt dans la - classe EmuConsole pour dumper la memoire externe. - * Ces nouvelles fonctions ont ete testees et semblent bien fonctionner. - -1999-04-09 Jonathan St-Andre - * Refait marche le RunningState avec les classes. - * Reconnecte les signaux aux boutons Trace, Run, Reset et Quit. - * Ajoute bouton Step qui ajoute un breakpoint a la ligne suivante - et passe en RunningState. Pratique lorsqu'arrive un CALL et qu'on ne - veut pas y entrer contrairement a Trace. - -1999-04-06 Jonathan St-Andre - * Creation de EmuConsole.hpp et EmuConsole.cpp - * Cette nouvelle archive est presque rendue au meme niveau que - l'ancienne. Vous allez pouvoir commencer a laisser faire l'ancienne - et vous concentrer sur celle-ci. - -(Les modifs annoncee se rapportent a l'ancienne archive mais elles ont ete -ramenee dans celle-ci par Jonathan St-Andre) -1999-04-05 Jonathan St-Andre - * Corrige qq malfonctions dans exec de mainconsole.cpp (nb d'inst. - peut etre l'infini, caractere est attendu au clavier seulement - si l'execution est arretee par une touche. - * Corrige probleme d'instructions sans operandes mal desassemblees - (il ne faut pas ecrire le caractere ' ' dans la chaine, il faut - utiliser sprintf avec " " a la place car sprintf termine la chaine - avec un 0 a la fin. La chaine n'etait pas terminee par un 0 et elle - affichait du garbage de la memoire) - * Corrige probleme dans disasm.cpp en rapport avec addr11 qui ne - prenait pas opcode mais memoire[opcode] (je devais etre chaud quand - j'ai ecrit ca). - * Bouton Run se change en Stop dans l'interface Gtk+ lorsque l'on - clique dessus et le cpu se met en mode execution. Les fonctions de - l'interface restent disponibles. N'importe quelle action dans - l'interface(excepte le fait de cliquer dans les fenetre memoire - et programme) cause l'arret de l'execution et la mise a jour - de l'affichage. - * Il est possible de placer des breakpoints pendant qu'il est - dans le "RunningState". - * Enleve les pixmaps sur les boutons dans l'interface Gtk+ - * Ajoute verification de breakpoint deja existant dans - setbreakpoint. - - Hugo Villeneuve - - * Modifie l'affichage de disasm pour que les operandes soient alignees. - * Modifie la fonction DP pour qu'elle prenne l'adresse du PC par - defaut si aucune adresse n'est specifiee. - - * Erreur avec l'instruction ACALL qui ne calculait pas l'adresse - correctement et qui ne poussait pas l'adresse de retour sur la pile. - Il est important que le PC soit incremente de 2 avant de calculer - addr11 et de pousser le PC sur la pile... - Il faut aussi modifier le dessassemblage de cette instruction qui - n'affiche que la deuxieme operande (adresse de 8 bits), alors que - l'adresse est sur 11 bits... - * Erreur avec l'instruction RET( fichier siae1.asm adresse 03A4) , - affiche RET @%K - * Ajoute la possibilite d'arreter l'execution du programme en pesant - sur n'importe quelle touche grace a la fonction kbhit(). - * Ajoute les fonctions SB, RB et DB pour les breakpoints dans le - mode console. L'execution se fait jusqu'au breakpoint. Une fois - arrive au breakpoint, si on fait de nouveau EM, on peut continuer - l'execution du programme passe ce breakpoint. Autrement dit, EM - ne verifie pas si la premiere instruction qu'il execute est un - break point, ce qui est pratique pour continuer l'execution du prog - apres un breakpoint. - -1999-03-31 Jonathan St-Andre - * Reecriture de TOUT les sources en imbriquant au maximum - dans des classes pour que ce soit plus lisible et reutilisable. - * Les classes sont CPU8051, Memory, EmuGtk, MemWin, RegWin, PgmWin - et les exceptions. - * Tout est en anglais pour rendre le programme disponible sur - internet. - * Je n'ai pas encore refais l'interface Console en classes donc - elle n'est pas incluse dans cette archive. Il faudrait vraiment - la refaire en tant que classe. - * Ajout fichiers TODO, CREDITS et COPYING (license GPL) - -1999-03-30 Jonathan St-Andre - * Corrige bug lors du desassemblage dans l'interpretation des - adresses directes dans 0-7F. disasm.cpp - * Corrige bug dans l'opcode 0x85, ajoute conditions particulieres - pour cette instruction dans script Perl et dans desassemblage. - Les operandes de cette instruction sont inversees dans la memoire - programme. Ex.: MOV 50H,51H est ecrit 85 51 50 dans la memoire - programme. - - Hugo Villeneuve - - * Bug dans les instructions ayant un mode d'adressage direct qui - utilisent des adresses dans 0-7F. Le desassembleur interprete les - adresses comme etant des adresses de bit. - * Bug dans l'opcode 0x85 MOV direct,direct. La source et la - destination sont inverses dans le desassemblage et dans l'execution. - -1999-03-29 Jonathan St-Andre - * Remplace string::erase pour string::replace partout, g++ a - l'universite ne connait pas encore string::erase, c'est trop recent. - * Ajoute "-w" pour disabler les warnings et "-fhandle-exceptions" - pour activer les exceptions a l'universite. - - Pascal Fecteau - - * Ajoute .h comme extension aux fichiers inclus, sinon ca ne - fonctionne pas a l'universite. - - Pascal Fecteau - Hugo Villeneuve - - * Corrige une erreur dans les instructions AJMP addr11 - -1999-03-28 Hugo Villeneuve - * Modification de la presentation de "Dump Register" sur la console. - Beaucoup plus facile a lire maintenant. - * Correction d'un bug dans l'instruction DA (opcode 0xD4). - -1999-03-27 Hugo Villeneuve - * Correction d'un probleme avec l'instruction CJNE. - * Correction de bugs dans LoadHexFile (voir 1999-03-22) - - Jonathan St-Andre - - * Augmente la hauteur de la fenetre Internal RAM. - * Correction de probleme avec tous les XCH et XCHD, l'operande source - n'etait pas modifiee (Trouve par Hugo et suggestion de correction par - Hugo). - * Ajout de P0, P1, P2 et P3 dans la fenetre des registres. - (Suggestion d'Hugo). - * View -> Data Memory Dump et View -> Program Memory Dump sont - fonctionnels. On ne peut visionner que les 16384 premiers octets. - Il ne veut pas prendre 65536 lignes dans une scrolled window. - Probablement parce que 18colonnes x 65536lignes = 1179648 cellules - est beaucoup trop. - * J'ai remarque qu'avec Gtk, on peut facilement changer les raccoucis - dans les menus. Pour associer "View -> Program Memory Dump" au - raccourci "Alt-2" par exemple, il suffit d'aller dans le menu "View", - se placer au dessus de "Program Memory Dump" et appuyer "Alt-2". - Le menu se modifiera automatiquement pour afficher "Alt-2" au bout - de la ligne et desormais, lorsque vous appuierez "Alt-2", l'action - sera executee. Ca dure seulement durant la session presente. - * Reduit la taille de la fenetre principale en largeur de 120 pixels - et en hauteur de 20 pixels. - -1999-03-25 Jonathan St-Andre - * Fenetre dump connais la position ou on clique dedans. - * Generalise dans une classe la fenetre memorydump, il sera plus - facile d'ajouter plusieurs fenetres memory dump a partir du menu - plus tard. - * Implemente Run jusqu'a un breakpoint (si aucun breakpoint, - loop sans fin -> il faut killer). - * Suffit de cliquer sur une ligne de programme dans Gtk pour placer - ou retirer un breakpoint. Les breakpoints apparaissent comme une - asterisque (*) a droite de l'adresse dans la fenetre program. - * Ajoute bouton Run dans interface Gtk - * Implemente quelques fonctions necessaires au breakpoints. - * Change un peu le layout - * Enleve image de fond (cause leger delai au chargement) - * Fait un peu de menage dans fichiers relatifs au Gtk - -1999-03-23 Jonathan St-Andre - * Changement des champs GTK_TEXT des fenetres Registre, Program et - Internal RAM pour des champs GTK_CLIST. Plus beau, moins de - flickering quand on trace et plus pratique pour ce qui s'en vient. - * Integration des fichiers xpm dans l'executable. Mais c'est encore - trop long a charger lors de l'execution, va probablement falloir les - compresser ou laisser faire l'image de fond. - * Ajout de pixmaps sur les boutons Trace, Reset et Quit (Gtk) - * Ajout de pixmap comme fond (Gtk) - -1999-03-22 Hugo Villeneuve - * Corrige un bug dans la fonction LoadHexFile : Le checksum n'etait - pas calcule correctement, ce qui entrainait des erreurs a l'ouverture - de certains fichiers HEX. L'erreur venait du fait que le checksum se - calculait avec la valeur absolue du LoadOffset, au lieu d'utiliser - les caracteres composant le LoadOffset. Exemple : si LoadOffset = - 0103, il faut additionner 01h+03h=4h au Checksum et non pas 0103h = - 259 en decimal. - * Deplace la fonction enleve_espaces de main_console vers mainemu - car elle est commune aux deux interfaces graphiques. - * Modifie la fonction majuscules pour qu'elle puisse convertir les - lettres de minuscule a majuscule meme si la chaine contient des - chiffres ou autres signes de ponctuation. - * Modifie la declaration des fonctions dans tous les fichiers .hpp: - enleve le nom des parametres car c'etait inutile. - * Stocke le nom des registres dans un fichier registres8051.hpp. - Ainsi, si on veut emuler un autre type de processeur, il suffira - de se creer un autre fichier registres8052xxx.hpp par exemple. - * Implemente l'affichage en francais ou en anglais dependant de - l'option passee sur la ligne de commande. L'interface est beaucoup - plus lisible de cette facon. Par defaut, l'affichage est en anglais. - -1999-03-21 Hugo Villeneuve - * Ajoute deux parametres qu'on peut passer par la ligne de commande: - /? affiche les options disponibles sur la ligne de commande. - -f force l'affichage en francais (pas encore implemente!!!) - * Ajoute le controle d'erreur pour le chargement d'un fichier HEX. - Les differentes erreurs sont controlees ( checksum, rectype, - fin de fichier, etc.). - * Modifie la fonction unasm pour qu'elle accepte 0,1 ou 2 parametres. - U (adresse) (nombre d'instructions) - Si adresse et nombre d'instructions non-specifies: - Adresse = PC et Nombre d'Instructions = 16 - Si adresse specifie et nombre d'instructions non-specifie: - Adresse = adresse specifiee et Nombre d'Instructions = 16 - Si adresse specifie et nombre d'instructions specifie: - Adresse = adresse specifiee et Nombre d'Instructions = nb specifie - A noter: on peut specifier une adresse comme etant un nombre - hexadecimal, ou tout simplement en entrant "PC" ou "pc". - - Jonathan St-Andre - - * Ajout des interruptions du port serie. - * Ajout du timer 2 (8052). - -1999-03-20 Hugo Villeneuve - * Separe le fichier main.cpp en deux: main.cpp et fonctions.cpp. - fonctions.cpp contient les fonctions necessaires a main.cpp. - * Ajoute un fichier exceptions.hpp qui permet de gerer les erreurs. - * Modifie le Makefile en consequence. - * On peut maintenant entrer les adresses < a quatre caracteres : - ex: adresse 0000h = 0 ou 00 ou 000 ou 0000. - * Enleve le include - * Remplace toutes les commandes printf du main par cout. - * Modifie l'apparence du menu. - * Le programme est maintenant plus robuste en ce qui concerne les - erreurs de syntaxe, les adresses invalides, etc (a tester...). - * Modifier l'operation et la syntaxe de certaines commandes - S (set register) devient MR (modify register) car set veut - plutot dire "mettre a 1", et on pourra aussi implementer - MM (modify Memory). - R devient DR (display Register), pour suivre la logique de - DP, DM et DI. - * Ajoute une commande Execute Memory: EM addr n - * La gestion des chaines de caracteres se fait maintenant - uniquement avec des variables de type STRING, selon le C++. - * Enleve variables i,j,k et inputcars dans le main. - * Modifie la fonction RESET pour quelle n'affiche pas les - registres au demarrage... ca faisait pas beau! Ajoute - cependant un message pour dire que le up est resette. - * Pour changer un registre, on doit entrer PC (et non p) ainsi - que SP (et non seulement s). - * Ajoute une fonction qui convertit une chaine de caracteres - en majuscules. - -1999-03-19 Jonathan St-Andre - * Fonction reset51() ajoutee dans cpu8051.cpp, reset() ajoutee - dans main.cpp. - * Commande "Z" fait un reset du processeur sur la console et le - bouton Reset fonctionne dans le GUI. - - Jimmy Ringuette - - * Les interruptions sont maintenant implementees. check_hardware() a - ete supprimee et Do_timers() est appelee directement de exec8051(). - -1999-03-18 Hugo Villeneuve - * Modifie l'entree des commandes pour gerer un peu plus les erreurs - de syntaxe (je n'ai pas fini, il y a encore de la job a faire pour - mettre ca error proof). - * Simplifie l'entree des parametres pour chacune des fonctions. - * Re-modifie l'instruction trace pour avoir seulement deux modes: - trace a adresse et trace 1 instruction. Cela simplifie l'entree de - la commande (on n'a pas a faire TA, qui n'est pas une commande - standard dans les emulateurs). Si on veut faire tracer pour plusieurs - instructions, alors il suffira d'implementer la commande - EXECUTE Nombre_instructions, ce qui est beaucoup plus logique et - c'est ce qu'on retrouve dans la plupart des emulateurs. - * Ajoute la description des commandes en francais (loi 101). - -1999-03-18 Jonathan St-Andre - * Le bouton Trace dans la version Gtk+ fonctionne. On peut tracer - et les 3 fenetres(registres, memoire, programme) se mettent a jour. - * Ajout de 2 nouvelles fonctions trace : "tracenb()" et "traceat()" - Qui, respectivement, prenent un nombre d'instruction a executer ou - une adresse ou commencer l'execution. La fonction trace() a ete - resimplifiee. - * Dans les instructions RET, RETI, LCALL, PUSH et POP la pile prend - la iram seulement pour les adresses sous 0x80, la data RAM est - utilisee autrement. Avant, les SFR se faisaient ecraser! - * Modes d'addressage addr16, reladdr, #data16 modifies! - En tenant compte de ce que Hugo avait fait remarquer ce matin : - ex.: si PC++ apparait 2 fois sur une ligne, les 2 fois il repartira - de la meme valeur de PC et suite a cette ligne, on se trouve avec - un PC incremente 1 fois au lieu de 2. - * Menu accepte maj/minuscules - * Corrige bug dans "setreg", les registres peuvent vraiment - etre donnes en maj/minuscules maintenant. - -1999-03-17 Hugo Villeneuve - * Correction de bugs relatifs a la compilation sur VC5. - Dont ajout de #include . - -1999-03-13 Jimmy Ringuette - * Ajout des timers dans cpu8051.cpp. Il faudrait tester a fond. - -1999-03-12 Jonathan St-Andre - * Je crois qu'il sera plus interessant si on garde le memory - dump normal dans une fenetre exterieur et dont on pourra en ouvrir - plusieurs pour monitorer differents endroits de la memoire, c'est - pourquoi je n'ai place que "Internal RAM" comme memory dump dans - la fenetre principale. - * Au demarrage, effectue un premier memory dump dans la fenetre - "Internal RAM", un unasm dans "Program" et un show register dans - "Registers". - * Bouton Quit, menus "File -> Quit" et "Help -> About" reagissent. - * Comporte maintenant 2 Makefile : Makefile.console(fonctionne sur - toutes les plateformes) et Makefile.gtk(teste seulement sous Linux). - * DEBUT d'interface graphique Gtk+ (ne fait qu'afficher une fenetre - avec un layout tres simple), presentement je cours apres des sources - de documentations.(le manuel n'est pas encore complet) - -1999-03-09 Jimmy Ringuette - * Regle le bug avec mul (probleme avec les bits 15-8 du resultat - ne se ramenaient pas dans les bits 7-0 du registre B) - * La conversion chaine->hexadecimal accepte les minuscules - * Il n'est plus obligatoire d'ecrire les 4 caracteres lorsqu'il faut - entrer une valeur hexadecimale. - -1999-03-05 Jonathan St-Andre - * Corrige un warning de compilation sous Solaris. - -1999-03-04 Jonathan St-Andre - * Ca execute! (presque) - * Phase de corrections des bugs dans les instructions, une premiere - implementation est faite pour toutes les instructions. - * Ajout fonction "trace" et "dump internal memory" - * Les modes d'adressage sont pratiquement termines dans - les instructions. - * Certaines instructions ont un debut d'implementation. - * Desassembleur, bit addressable segment 00-7F -> 20.0-2F.7 - -1999-03-03 Jonathan St-Andre - * Ajout automatique de certaines lignes de codes concernant - l'adressage dans les fonctions d'instructions tres brouillon - * Ajout de stub pour write_mem et read_mem, modifs dans exec8051 - * Ajout de la fonction showregister() et de la commande 'r'. - * Correction d'une erreur iram_mem doit etre unsigned char et non int - * Note : Il y a des references a certaines parties du 8052 mais - elles ne seront pas implementees. Ce n'est qu'a titre d'informations. - * Ajout de #define pour faire correspondre les registres SFR avec - leur adresse dans la iram. - * Renomme instructions.cpp a instructions.hpp et ajout du tableau - de pointeurs sur les fonctions - * Ajout de la ram interne 00-FF et valeurs initiale au reset - dans cpu8051.cpp avec le registre : unsigned int PC. - * Ajout de cpu8051.cpp contenant exec8051() - -1999-03-02 Jonathan St-Andre - * Ajout de remarques dans le source - * Il faudrait maintenant tester avec plusieurs programmes pour - reperer les bugs. - * Le desassembleur reconnait maintenant les registres du SFR - (ex.: 88H est remplace par TCON, F0 par B, etc...) - * Changement au desassembleur (instructions peuvent avoir jusqu'a 3 - arguments ex.: CJNE R0,#data,reladdr) - * La vrai instruction CJNE comporte 3 arguments il faut changer - radicalement le desassembleur - -1999-03-01 Jonathan St-Andre - * Probleme dans opcodes.lst au niveau de l'instruction CJNE (mauvaise - definition) - * Tous les types d'adressages semblent fonctionner - * Le desassembleur peut lire les arguments et les afficher - (ex.: MOV A,#data peut devenir plus concret MOV A,#20) - * Desassembleur (instructions ont 2 arguments : instleftarg et - instrightarg) - -1999-02-28 Jonathan St-Andre - * Charge un fichier .hex donne en parametre (format Intel Hexadecimal - produit par ASM51) - * Effectue le dump program memory et dump data memory - * On peut quitter (YEAH!) - * Affiche le menu - * Creation de opcodes.lst et script Perl pour l'interpreter - * Debut diff --git a/Makefile.am b/Makefile.am index df08920..a9c5d47 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,7 @@ ## Makefile.am -- Process this file with automake to produce Makefile.in +.PHONY: changelog + AUTOMAKE_OPTIONS = gnu SUBDIRS = src/common src/cli src/gtk data doc tests @@ -15,10 +17,20 @@ CLEANFILES = *~ DISTCLEANFILES = .deps/*.P MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure config-h.in \ - stamp-h.in $(ac_aux_dir)/depcomp \ + stamp-h.in ChangeLog $(ac_aux_dir)/depcomp \ $(ac_aux_dir)/install-sh $(ac_aux_dir)/missing \ $(ac_aux_dir)/mkinstalldirs $(ac_aux_dir)/config.guess \ $(ac_aux_dir)/config.sub $(ac_aux_dir)/ltmain.sh \ $(ac_aux_dir)/compile \ $(ac_aux_dir)/test-driver \ $(ac_aux_dir)/ar-lib + +changelog: + @if test -d $(srcdir)/.git; then \ + $(srcdir)/build-aux/gitlog-to-changelog \ + --format='%s%n%n%b%n' \ + --no-cluster \ + --strip-tab \ + --strip-cherry-pick \ + >ChangeLog; \ + fi diff --git a/autogen.sh b/autogen.sh index ef6884b..4b1afe0 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,6 +1,9 @@ #!/bin/sh # autogen.sh -- Use this script to create generated files from the git distribution +# ChangeLog is generated from git log output using "make changelog" +touch ChangeLog + set -e autoreconf -vi rm -rf autom4te.cache diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog new file mode 100755 index 0000000..7bab70d --- /dev/null +++ b/build-aux/gitlog-to-changelog @@ -0,0 +1,432 @@ +eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' + & eval 'exec perl -wS "$0" $argv:q' + if 0; +# Convert git log output to ChangeLog format. + +my $VERSION = '2014-01-15 03:30'; # UTC +# The definition above must lie within the first 8 lines in order +# for the Emacs time-stamp write hook (at end) to update it. +# If you change this file with Emacs, please let the write hook +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2014 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Written by Jim Meyering + +use strict; +use warnings; +use Getopt::Long; +use POSIX qw(strftime); + +(my $ME = $0) =~ s|.*/||; + +# use File::Coda; # http://meyering.net/code/Coda/ +END { + defined fileno STDOUT or return; + close STDOUT and return; + warn "$ME: failed to close standard output: $!\n"; + $? ||= 1; +} + +sub usage ($) +{ + my ($exit_code) = @_; + my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); + if ($exit_code != 0) + { + print $STREAM "Try '$ME --help' for more information.\n"; + } + else + { + print $STREAM < ChangeLog + $ME -- -n 5 foo > last-5-commits-to-branch-foo + +SPECIAL SYNTAX: + +The following types of strings are interpreted specially when they appear +at the beginning of a log message line. They are not copied to the output. + + Copyright-paperwork-exempt: Yes + Append the "(tiny change)" notation to the usual "date name email" + ChangeLog header to mark a change that does not require a copyright + assignment. + Co-authored-by: Joe User + List the specified name and email address on a second + ChangeLog header, denoting a co-author. + Signed-off-by: Joe User + These lines are simply elided. + +In a FILE specified via --amend, comment lines (starting with "#") are ignored. +FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on +a line) referring to a commit in the current project, and CODE refers to one +or more consecutive lines of Perl code. Pairs must be separated by one or +more blank line. + +Here is sample input for use with --amend=FILE, from coreutils: + +3a169f4c5d9159283548178668d2fae6fced3030 +# fix typo in title: +s/all tile types/all file types/ + +1379ed974f1fa39b12e2ffab18b3f7a607082202 +# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. +# Change the author to be Paul. Note the escaped "@": +s,Jim .*>,Paul Eggert , + +EOF + } + exit $exit_code; +} + +# If the string $S is a well-behaved file name, simply return it. +# If it contains white space, quotes, etc., quote it, and return the new string. +sub shell_quote($) +{ + my ($s) = @_; + if ($s =~ m![^\w+/.,-]!) + { + # Convert each single quote to '\'' + $s =~ s/\'/\'\\\'\'/g; + # Then single quote the string. + $s = "'$s'"; + } + return $s; +} + +sub quoted_cmd(@) +{ + return join (' ', map {shell_quote $_} @_); +} + +# Parse file F. +# Comment lines (starting with "#") are ignored. +# F must consist of pairs where SHA is a 40-byte SHA1 +# (alone on a line) referring to a commit in the current project, and +# CODE refers to one or more consecutive lines of Perl code. +# Pairs must be separated by one or more blank line. +sub parse_amend_file($) +{ + my ($f) = @_; + + open F, '<', $f + or die "$ME: $f: failed to open for reading: $!\n"; + + my $fail; + my $h = {}; + my $in_code = 0; + my $sha; + while (defined (my $line = )) + { + $line =~ /^\#/ + and next; + chomp $line; + $line eq '' + and $in_code = 0, next; + + if (!$in_code) + { + $line =~ /^([0-9a-fA-F]{40})$/ + or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), + $fail = 1, next; + $sha = lc $1; + $in_code = 1; + exists $h->{$sha} + and (warn "$ME: $f:$.: duplicate SHA1\n"), + $fail = 1, next; + } + else + { + $h->{$sha} ||= ''; + $h->{$sha} .= "$line\n"; + } + } + close F; + + $fail + and exit 1; + + return $h; +} + +# git_dir_option $SRCDIR +# +# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR +# is undef). Return as a list (0 or 1 element). +sub git_dir_option($) +{ + my ($srcdir) = @_; + my @res = (); + if (defined $srcdir) + { + my $qdir = shell_quote $srcdir; + my $cmd = "cd $qdir && git rev-parse --show-toplevel"; + my $qcmd = shell_quote $cmd; + my $git_dir = qx($cmd); + defined $git_dir + or die "$ME: cannot run $qcmd: $!\n"; + $? == 0 + or die "$ME: $qcmd had unexpected exit code or signal ($?)\n"; + chomp $git_dir; + push @res, "--git-dir=$git_dir/.git"; + } + @res; +} + +{ + my $since_date; + my $format_string = '%s%n%b%n'; + my $amend_file; + my $append_dot = 0; + my $cluster = 1; + my $strip_tab = 0; + my $strip_cherry_pick = 0; + my $srcdir; + GetOptions + ( + help => sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + 'since=s' => \$since_date, + 'format=s' => \$format_string, + 'amend=s' => \$amend_file, + 'append-dot' => \$append_dot, + 'cluster!' => \$cluster, + 'strip-tab' => \$strip_tab, + 'strip-cherry-pick' => \$strip_cherry_pick, + 'srcdir=s' => \$srcdir, + ) or usage 1; + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + + # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) + # that makes a correction in the log or attribution of that commit. + my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; + + my @cmd = ('git', + git_dir_option $srcdir, + qw(log --log-size), + '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); + open PIPE, '-|', @cmd + or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n" + . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); + + my $prev_multi_paragraph; + my $prev_date_line = ''; + my @prev_coauthors = (); + while (1) + { + defined (my $in = ) + or last; + $in =~ /^log size (\d+)$/ + or die "$ME:$.: Invalid line (expected log size):\n$in"; + my $log_nbytes = $1; + + my $log; + my $n_read = read PIPE, $log, $log_nbytes; + $n_read == $log_nbytes + or die "$ME:$.: unexpected EOF\n"; + + # Extract leading hash. + my ($sha, $rest) = split ':', $log, 2; + defined $sha + or die "$ME:$.: malformed log entry\n"; + $sha =~ /^[0-9a-fA-F]{40}$/ + or die "$ME:$.: invalid SHA1: $sha\n"; + + # If this commit's log requires any transformation, do it now. + my $code = $amend_code->{$sha}; + if (defined $code) + { + eval 'use Safe'; + my $s = new Safe; + # Put the unpreprocessed entry into "$_". + $_ = $rest; + + # Let $code operate on it, safely. + my $r = $s->reval("$code") + or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; + + # Note that we've used this entry. + delete $amend_code->{$sha}; + + # Update $rest upon success. + $rest = $_; + } + + # Remove lines inserted by "git cherry-pick". + if ($strip_cherry_pick) + { + $rest =~ s/^\s*Conflicts:\n.*//sm; + $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m; + } + + my @line = split "\n", $rest; + my $author_line = shift @line; + defined $author_line + or die "$ME:$.: unexpected EOF\n"; + $author_line =~ /^(\d+) (.*>)$/ + or die "$ME:$.: Invalid line " + . "(expected date/author/email):\n$author_line\n"; + + # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog + # `(tiny change)' annotation. + my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line) + ? ' (tiny change)' : ''); + + my $date_line = sprintf "%s %s$tiny\n", + strftime ("%F", localtime ($1)), $2; + + my @coauthors = grep /^Co-authored-by:.*$/, @line; + # Omit meta-data lines we've already interpreted. + @line = grep !/^(?:Signed-off-by:[ ].*>$ + |Co-authored-by:[ ] + |Copyright-paperwork-exempt:[ ] + )/x, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Record whether there are two or more paragraphs. + my $multi_paragraph = grep /^\s*$/, @line; + + # Format 'Co-authored-by: A U Thor ' lines in + # standard multi-author ChangeLog format. + for (@coauthors) + { + s/^Co-authored-by:\s*/\t /; + s/\s*/ + or warn "$ME: warning: missing email address for " + . substr ($_, 5) . "\n"; + } + + # If clustering of commit messages has been disabled, if this header + # would be different from the previous date/name/email/coauthors header, + # or if this or the previous entry consists of two or more paragraphs, + # then print the header. + if ( ! $cluster + || $date_line ne $prev_date_line + || "@coauthors" ne "@prev_coauthors" + || $multi_paragraph + || $prev_multi_paragraph) + { + $prev_date_line eq '' + or print "\n"; + print $date_line; + @coauthors + and print join ("\n", @coauthors), "\n"; + } + $prev_date_line = $date_line; + @prev_coauthors = @coauthors; + $prev_multi_paragraph = $multi_paragraph; + + # If there were any lines + if (@line == 0) + { + warn "$ME: warning: empty commit message:\n $date_line\n"; + } + else + { + if ($append_dot) + { + # If the first line of the message has enough room, then + if (length $line[0] < 72) + { + # append a dot if there is no other punctuation or blank + # at the end. + $line[0] =~ /[[:punct:]\s]$/ + or $line[0] .= '.'; + } + } + + # Remove one additional leading TAB from each line. + $strip_tab + and map { s/^\t// } @line; + + # Prefix each non-empty line with a TAB. + @line = map { length $_ ? "\t$_" : '' } @line; + + print "\n", join ("\n", @line), "\n"; + } + + defined ($in = ) + or last; + $in ne "\n" + and die "$ME:$.: unexpected line:\n$in"; + } + + close PIPE + or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; + # FIXME-someday: include $PROCESS_STATUS in the diagnostic + + # Complain about any unused entry in the --amend=F specified file. + my $fail = 0; + foreach my $sha (keys %$amend_code) + { + warn "$ME:$amend_file: unused entry: $sha\n"; + $fail = 1; + } + + exit $fail; +} + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "my $VERSION = '" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "'; # UTC" +# End: -- 2.20.1