Hi Richard, please, find attached a patch that introduces "--brief" (short "-q") option to "fossil diff" that acts analogous to regular "diff --brief" or "diff -q". It suppresses diff contents and outputs just the file names that differ. Output format is similar to "fossil changes". But unlike "fossil changes" "fossil diff -q" can take --from and --to options and, thus, compare arbitrary commits. Affects of -q/--brief are limited to the internal diff implementation and is noop if external diff is used.
The patch is against the trunk [b1530c29ab]. Thanks, --Leo--
#### Fossil-SCM patch against trunk commit: artifact: b1530c29ab659a56f488e4386f242eb758858f22 tags: trunk type: Check-in by drh on 2012-02-07 04:15:41 comment: Add chunk number fragment marks to HTML diff output. #### Index: src/diffcmd.c ================================================================== --- src/diffcmd.c~0 2012-02-07 07:49:53.000000000 -0500 +++ src/diffcmd.c 2012-02-07 07:32:34.000000000 -0500 @@ -19,15 +19,27 @@ */ #include "config.h" #include "diffcmd.h" #include <assert.h> +/* Flag to supress diff output if -q or --brief option is given + * to the internal diff command + */ +static int hasQFlag = 0; + /* ** Print the "Index:" message that patches wants to see at the top of a diff. +** If -q/--brief then print CHANGED instead. */ void diff_print_index(const char *zFile, int diffFlags){ - if( (diffFlags & DIFF_SIDEBYSIDE)==0 ){ + if( (diffFlags & DIFF_SIDEBYSIDE) ){ + return; + } else if( hasQFlag ){ + char *z = mprintf("CHANGED %s\n", zFile); + fossil_print("%s", z); + fossil_free(z); + } else { char *z = mprintf("Index: %s\n%.66c\n", zFile, '='); fossil_print("%s", z); fossil_free(z); } } @@ -35,10 +47,12 @@ void diff_print_index(const char *zFile, /* ** Print the +++/--- filename lines for a diff operation. */ void diff_print_filenames(const char *zLeft, const char *zRight, int diffFlags){ char *z = 0; + if( hasQFlag ){ return; } /* don't print anything in -q/--brief mode */ + if( diffFlags & DIFF_SIDEBYSIDE ){ int w = diff_width(diffFlags); int n1 = strlen(zLeft); int x; if( n1>w*2 ) n1 = w*2; @@ -89,11 +103,11 @@ void diff_file( /* Compute and output the differences */ blob_zero(&out); text_diff(pFile1, &file2, &out, diffFlags); if( blob_size(&out) ){ diff_print_filenames(zName, zName2, diffFlags); - fossil_print("%s\n", blob_str(&out)); + if( !hasQFlag ){ fossil_print("%s\n", blob_str(&out)); } } /* Release memory resources */ blob_reset(&file2); blob_reset(&out); @@ -148,11 +162,11 @@ void diff_file_mem( Blob out; /* Diff output text */ blob_zero(&out); text_diff(pFile1, pFile2, &out, diffFlags); diff_print_filenames(zName, zName, diffFlags); - fossil_print("%s\n", blob_str(&out)); + if( !hasQFlag ){ fossil_print("%s\n", blob_str(&out)); } /* Release memory resources */ blob_reset(&out); }else{ Blob cmd; @@ -199,10 +213,11 @@ static void diff_one_against_disk( historical_version_of_file(zFrom, blob_str(&fname), &content, &isLink, 0, 0); if( !isLink != !file_wd_islink(zFrom) ){ fossil_print("cannot compute difference between " "symlink and regular file\n"); }else{ + diff_print_index(zFileTreeName, diffFlags); diff_file(&content, zFileTreeName, zFileTreeName, zDiffCmd, diffFlags); } blob_reset(&content); blob_reset(&fname); } @@ -283,11 +298,11 @@ static void diff_all_against_disk( }else if( isNew ){ fossil_print("ADDED %s\n", zPathname); srcid = 0; if( !asNewFile ){ showDiff = 0; } }else if( isChnged==3 ){ - fossil_print("ADDED_BY_MERGE %s\n", zPathname); + fossil_print("ADDED_BY_MERGE %s\n", zPathname); srcid = 0; if( !asNewFile ){ showDiff = 0; } } if( showDiff ){ Blob content; @@ -403,27 +418,27 @@ static void diff_all_two_versions( cmp = -1; }else{ cmp = fossil_strcmp(pFromFile->zName, pToFile->zName); } if( cmp<0 ){ - fossil_print("DELETED %s\n", pFromFile->zName); + fossil_print("DELETED %s\n", pFromFile->zName); if( asNewFlag ){ diff_manifest_entry(pFromFile, 0, zDiffCmd, diffFlags); } pFromFile = manifest_file_next(pFrom,0); }else if( cmp>0 ){ - fossil_print("ADDED %s\n", pToFile->zName); + fossil_print("ADDED %s\n", pToFile->zName); if( asNewFlag ){ diff_manifest_entry(0, pToFile, zDiffCmd, diffFlags); } pToFile = manifest_file_next(pTo,0); }else if( fossil_strcmp(pFromFile->zUuid, pToFile->zUuid)==0 ){ /* No changes */ pFromFile = manifest_file_next(pFrom,0); pToFile = manifest_file_next(pTo,0); }else{ - /* fossil_print("CHANGED %s\n", pFromFile->zName); */ + /* fossil_print("CHANGED %s\n", pFromFile->zName); */ diff_manifest_entry(pFromFile, pToFile, zDiffCmd, diffFlags); pFromFile = manifest_file_next(pFrom,0); pToFile = manifest_file_next(pTo,0); } } @@ -461,10 +476,11 @@ static void diff_all_two_versions( ** ** Options: ** --context|-c N Use N lines of context ** --from|-r VERSION select VERSION as source for the diff ** --new-file|-N output complete text of added or deleted files +** --brief|-q when using internal diff suppress diff output ** -i use internal diff logic ** --to VERSION select VERSION as target for the diff ** --side-by-side|-y side-by-side diff ** --width|-W N Width of lines in side-by-side diff */ @@ -482,10 +498,11 @@ void diff_cmd(void){ isInternDiff = find_option("internal","i",0)!=0; zFrom = find_option("from", "r", 1); zTo = find_option("to", 0, 1); diffFlags = diff_options(); hasNFlag = find_option("new-file","N",0)!=0; + hasQFlag = find_option("brief" ,"q",0)!=0; if( hasNFlag ) diffFlags |= DIFF_NEWFILE; if( zTo==0 ){ db_must_be_within_tree(); verify_all_options(); #EoF
_______________________________________________ fossil-users mailing list fossil-users@lists.fossil-scm.org http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users