Hi,

A patch (against trunk, 14d8d31b1a) that adds the option '--numstat' to
'fossil diff' for functionality similar to 'git diff --numstat': for
each file in the diff a line is output with three elements: number of
added lines, number of removed lines, and the file path, separated with
tabs.

Best regards,
Daniel

Am 19.06.2017 um 23:19 schrieb Ross Berteig:
> On 6/18/2017 7:22 PM, The Tick wrote:
>> Just wondering if this exists or if it would have to be scripted -- a
>> way to get a per-file recap of added/changed/removed lines for the
>> files in a commit. It would be a way to quickly gauge the amount of
>> changes that had occurred.
> 
> Of course there's the simple list provided by "fossil changes", but that
> only shows file names which changed.
> 
> There's aksi  "fossil diff --brief", which also only shows file names
> with changes. Without the --brief option, it shows the entire change,
> which is more than you wanted. But it does support the --checkin option
> which shows what changed in that particular checkin.
> 
> If you configure fossil to use an external diff utility, you might be
> able to find one that has a summary mode that is more verbose than
> --brief and less complete than the usual output. The somewhat elderly
> GNU diff I have here on my Windows box (version 2.8.7 built in 2004
> apparently) does not have such an option.  Read about "fossil set
> diff-command" for how to do that.
> 
Index: src/diff.c
==================================================================
--- src/diff.c
+++ src/diff.c
@@ -39,2 +39,3 @@
 #define DIFF_LINENO       ((u64)0x40000000) /* Show line numbers */
+#define DIFF_NUMSTAT      ((u64)0x80000000) /* Show statistics */
 #define DIFF_NOOPT        (((u64)0x01)<<32) /* Suppress optimizations (debug) 
*/
@@ -1958,2 +1959,3 @@
 **   -Z|--ignore-trailing-space Ignore eol-whitespaces DIFF_IGNORE_EOLWS
+**   --numstat                  Display statistics     DIFF_NUMSTAT
 */
@@ -1988,2 +1990,3 @@
   if( find_option("linenum","n",0)!=0 ) diffFlags |= DIFF_LINENO;
+  if( find_option("numstat",0,0)!=0 ) diffFlags |= DIFF_NUMSTAT;
   if( find_option("noopt",0,0)!=0 ) diffFlags |= DIFF_NOOPT;

Index: src/diffcmd.c
==================================================================
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -111,3 +111,3 @@
 void diff_print_index(const char *zFile, u64 diffFlags){
-  if( (diffFlags & (DIFF_SIDEBYSIDE|DIFF_BRIEF))==0 ){
+  if( (diffFlags & (DIFF_SIDEBYSIDE|DIFF_BRIEF|DIFF_NUMSTAT))==0 ){
     char *z = mprintf("Index: %s\n%.66c\n", zFile, '=');
@@ -200,2 +200,18 @@
       }
+       }
+       else if( diffFlags & DIFF_NUMSTAT ){
+         int *R;
+         int r;
+         int linesDeleted = 0;
+         int linesAdded = 0;
+         if( fSwapDiff ) {
+               R = text_diff(&file2, pFile1, 0, 0, diffFlags);
+         }else{
+               R = text_diff(pFile1, &file2, 0, 0, diffFlags);
+         }
+         for(r=0; R[r] || R[r+1] || R[r+2]; r += 3){
+           linesDeleted += R[r+1];
+           linesAdded += R[r+2];
+         }
+         fossil_print("%d\t%d\t%s\n", linesAdded, linesDeleted, zName);
     }else{
@@ -309,2 +325,15 @@
   if( diffFlags & DIFF_BRIEF ) return;
+  if( diffFlags & DIFF_NUMSTAT ){
+       int *R;
+       int r;
+       int linesDeleted = 0;
+       int linesAdded = 0;
+       R = text_diff(pFile1, pFile2, 0, 0, diffFlags);
+       for(r=0; R[r] || R[r+1] || R[r+2]; r += 3){
+         linesDeleted += R[r+1];
+         linesAdded += R[r+2];
+       }
+       fossil_print("%d\t%d\t%s\n", linesAdded, linesDeleted, zName);
+       return;
+  }
   if( zDiffCmd==0 ){
@@ -860,2 +889,3 @@
   int againstUndo = 0;       /* Diff against files in the undo buffer */
+  int numStat = 0;           /* Print diff statistics */
   u64 diffFlags = 0;         /* Flags to control the DIFF */

_______________________________________________
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to