| | @@ -44,11 +44,11 @@ |
| 44 | 44 | |
| 45 | 45 | /* |
| 46 | 46 | ** COMMAND: diff |
| 47 | 47 | ** COMMAND: gdiff |
| 48 | 48 | ** |
| 49 | | -** Usage: %fossil diff|gdiff ?-i FILE... |
| 49 | +** Usage: %fossil diff|gdiff ?-i ?-r REVISION FILE... |
| 50 | 50 | ** |
| 51 | 51 | ** Show the difference between the current version of a file (as it |
| 52 | 52 | ** exists on disk) and that same file as it was checked out. |
| 53 | 53 | ** |
| 54 | 54 | ** diff will show a textual diff while gdiff will attempt to run a |
| | @@ -69,18 +69,20 @@ |
| 69 | 69 | ** %fossil config gdiff-command=meld |
| 70 | 70 | ** %fossil config gdiff-command=xxdiff |
| 71 | 71 | ** %fossil config gdiff-command=kdiff3 |
| 72 | 72 | */ |
| 73 | 73 | void diff_cmd(void){ |
| 74 | | - const char *zFile; |
| 74 | + const char *zFile, *zRevision; |
| 75 | 75 | Blob cmd; |
| 76 | 76 | Blob fname; |
| 77 | | - int i, internalDiff; |
| 78 | | - char *zV1 = 0; |
| 79 | | - char *zV2 = 0; |
| 77 | + Blob vname; |
| 78 | + Blob record; |
| 79 | + int cnt=0,internalDiff; |
| 80 | 80 | |
| 81 | 81 | internalDiff = find_option("internal","i",0)!=0; |
| 82 | + zRevision = find_option("revision", "r", 1); |
| 83 | + verify_all_options(); |
| 82 | 84 | |
| 83 | 85 | if( g.argc<3 ){ |
| 84 | 86 | usage("?OPTIONS? FILE"); |
| 85 | 87 | } |
| 86 | 88 | db_must_be_within_tree(); |
| | @@ -96,66 +98,48 @@ |
| 96 | 98 | internalDiff=1; |
| 97 | 99 | } |
| 98 | 100 | blob_zero(&cmd); |
| 99 | 101 | blob_appendf(&cmd, "%s ", zExternalCommand); |
| 100 | 102 | } |
| 101 | | - for(i=2; i<g.argc-1; i++){ |
| 102 | | - const char *z = g.argv[i]; |
| 103 | | - if( (strcmp(z,"-v")==0 || strcmp(z,"--version")==0) && i<g.argc-2 ){ |
| 104 | | - if( zV1==0 ){ |
| 105 | | - zV1 = g.argv[i+1]; |
| 106 | | - }else if( zV2==0 ){ |
| 107 | | - zV2 = g.argv[i+1]; |
| 108 | | - }else{ |
| 109 | | - fossil_panic("too many versions"); |
| 110 | | - } |
| 111 | | - }else{ |
| 112 | | - if( internalDiff==0 ){ |
| 113 | | - blob_appendf(&cmd, "%s ", z); |
| 114 | | - } |
| 115 | | - } |
| 116 | | - } |
| 117 | 103 | zFile = g.argv[g.argc-1]; |
| 118 | 104 | if( !file_tree_name(zFile, &fname) ){ |
| 119 | 105 | fossil_panic("unknown file: %s", zFile); |
| 120 | 106 | } |
| 121 | | - if( zV1==0 ){ |
| 107 | + |
| 108 | + blob_zero(&vname); |
| 109 | + do{ |
| 110 | + blob_reset(&vname); |
| 111 | + blob_appendf(&vname, "%s~%d", zFile, cnt++); |
| 112 | + }while( access(blob_str(&vname),0)==0 ); |
| 113 | + |
| 114 | + if( zRevision==0 ){ |
| 122 | 115 | int rid = db_int(0, "SELECT rid FROM vfile WHERE pathname=%B", &fname); |
| 123 | | - Blob record; |
| 124 | | - Blob vname; |
| 125 | | - int cnt = 0; |
| 126 | | - |
| 127 | 116 | if( rid==0 ){ |
| 128 | 117 | fossil_panic("no history for file: %b", &fname); |
| 129 | 118 | } |
| 130 | | - blob_zero(&vname); |
| 131 | | - do{ |
| 132 | | - blob_reset(&vname); |
| 133 | | - blob_appendf(&vname, "%s~%d", zFile, cnt++); |
| 134 | | - }while( access(blob_str(&vname),0)==0 ); |
| 135 | 119 | content_get(rid, &record); |
| 136 | | - if( internalDiff==1 ){ |
| 137 | | - Blob current; |
| 138 | | - Blob out; |
| 139 | | - blob_zero(¤t); |
| 140 | | - blob_read_from_file(¤t, zFile); |
| 141 | | - blob_zero(&out); |
| 142 | | - unified_diff(&record, ¤t, 5, &out); |
| 143 | | - printf("%s\n", blob_str(&out)); |
| 144 | | - blob_reset(¤t); |
| 145 | | - blob_reset(&out); |
| 146 | | - }else{ |
| 147 | | - blob_write_to_file(&record, blob_str(&vname)); |
| 148 | | - blob_reset(&record); |
| 149 | | - shell_escape(&cmd, blob_str(&vname)); |
| 150 | | - blob_appendf(&cmd, " "); |
| 151 | | - shell_escape(&cmd, zFile); |
| 152 | | - system(blob_str(&cmd)); |
| 153 | | - unlink(blob_str(&vname)); |
| 154 | | - blob_reset(&vname); |
| 155 | | - blob_reset(&cmd); |
| 156 | | - } |
| 157 | | - }else{ |
| 158 | | - fossil_panic("not yet implemented"); |
| 120 | + }else{ |
| 121 | + content_get_historical_file(zRevision, zFile, &record); |
| 122 | + } |
| 123 | + if( internalDiff==1 ){ |
| 124 | + Blob out; |
| 125 | + Blob current; |
| 126 | + blob_zero(¤t); |
| 127 | + blob_read_from_file(¤t, zFile); |
| 128 | + blob_zero(&out); |
| 129 | + unified_diff(&record, ¤t, 5, &out); |
| 130 | + printf("%s\n", blob_str(&out)); |
| 131 | + blob_reset(¤t); |
| 132 | + blob_reset(&out); |
| 133 | + }else{ |
| 134 | + blob_write_to_file(&record, blob_str(&vname)); |
| 135 | + blob_reset(&record); |
| 136 | + shell_escape(&cmd, blob_str(&vname)); |
| 137 | + blob_appendf(&cmd, " "); |
| 138 | + shell_escape(&cmd, zFile); |
| 139 | + system(blob_str(&cmd)); |
| 140 | + unlink(blob_str(&vname)); |
| 141 | + blob_reset(&vname); |
| 142 | + blob_reset(&cmd); |
| 159 | 143 | } |
| 160 | 144 | blob_reset(&fname); |
| 161 | 145 | } |
| 162 | 146 | |