Fossil SCM

Always show diffs for added and deleted files in the web UI. Show added and deleted files in diffs with -N and the --from and --to options to the command-line diff command. Ticket [e90d38c2054e9b44792]

drh 2010-10-14 20:28 trunk
Commit 703653489ee450dad4ddac0c010f03d343ff32a2
3 files changed +42 -15 +38 -28 +1 -1
+42 -15
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -312,10 +312,42 @@
312312
diff_file_mem(&v1, &v2, zName, zDiffCmd, ignoreEolWs);
313313
blob_reset(&v1);
314314
blob_reset(&v2);
315315
blob_reset(&fname);
316316
}
317
+
318
+/*
319
+** Show the difference between two files identified by ManifestFile
320
+** entries.
321
+*/
322
+static void diff_manifest_entry(
323
+ struct ManifestFile *pFrom,
324
+ struct ManifestFile *pTo,
325
+ const char *zDiffCmd,
326
+ int ignoreEolWs
327
+){
328
+ Blob f1, f2;
329
+ int rid;
330
+ const char *zName = pFrom ? pFrom->zName : pTo->zName;
331
+ printf("Index: %s\n======================================="
332
+ "============================\n", zName);
333
+ if( pFrom ){
334
+ rid = uuid_to_rid(pFrom->zUuid, 0);
335
+ content_get(rid, &f1);
336
+ }else{
337
+ blob_zero(&f1);
338
+ }
339
+ if( pTo ){
340
+ rid = uuid_to_rid(pTo->zUuid, 0);
341
+ content_get(rid, &f2);
342
+ }else{
343
+ blob_zero(&f2);
344
+ }
345
+ diff_file_mem(&f1, &f2, zName, zDiffCmd, ignoreEolWs);
346
+ blob_reset(&f1);
347
+ blob_reset(&f2);
348
+}
317349
318350
/*
319351
** Output the differences between two check-ins.
320352
*/
321353
static void diff_all_two_versions(
@@ -325,16 +357,16 @@
325357
int diffFlags
326358
){
327359
Manifest mFrom, mTo;
328360
int iFrom, iTo;
329361
int ignoreEolWs = (diffFlags & DIFF_NOEOLWS)!=0 ? 1 : 0;
330
- /* int asNewFlag = (diffFlags & DIFF_NEWFILE)!=0 ? 1 : 0; */
362
+ int asNewFlag = (diffFlags & DIFF_NEWFILE)!=0 ? 1 : 0;
331363
332364
manifest_from_name(zFrom, &mFrom);
333365
manifest_from_name(zTo, &mTo);
334366
iFrom = iTo = 0;
335
- while( iFrom<mFrom.nFile && iTo<mTo.nFile ){
367
+ while( iFrom<mFrom.nFile || iTo<mTo.nFile ){
336368
int cmp;
337369
if( iFrom>=mFrom.nFile ){
338370
cmp = +1;
339371
}else if( iTo>=mTo.nFile ){
340372
cmp = -1;
@@ -341,33 +373,28 @@
341373
}else{
342374
cmp = strcmp(mFrom.aFile[iFrom].zName, mTo.aFile[iTo].zName);
343375
}
344376
if( cmp<0 ){
345377
printf("DELETED %s\n", mFrom.aFile[iFrom].zName);
378
+ if( asNewFlag ){
379
+ diff_manifest_entry(&mFrom.aFile[iFrom], 0, zDiffCmd, ignoreEolWs);
380
+ }
346381
iFrom++;
347382
}else if( cmp>0 ){
348383
printf("ADDED %s\n", mTo.aFile[iTo].zName);
384
+ if( asNewFlag ){
385
+ diff_manifest_entry(0, &mTo.aFile[iTo], zDiffCmd, ignoreEolWs);
386
+ }
349387
iTo++;
350388
}else if( strcmp(mFrom.aFile[iFrom].zUuid, mTo.aFile[iTo].zUuid)==0 ){
351389
/* No changes */
352390
iFrom++;
353391
iTo++;
354392
}else{
355
- Blob f1, f2;
356
- int rid;
357393
printf("CHANGED %s\n", mFrom.aFile[iFrom].zName);
358
- printf("Index: %s\n======================================="
359
- "============================\n",
360
- mFrom.aFile[iFrom].zName
361
- );
362
- rid = uuid_to_rid(mFrom.aFile[iFrom].zUuid, 0);
363
- content_get(rid, &f1);
364
- rid = uuid_to_rid(mTo.aFile[iTo].zUuid, 0);
365
- content_get(rid, &f2);
366
- diff_file_mem(&f1, &f2, mFrom.aFile[iFrom].zName, zDiffCmd, ignoreEolWs);
367
- blob_reset(&f1);
368
- blob_reset(&f2);
394
+ diff_manifest_entry(&mFrom.aFile[iFrom], &mTo.aFile[iTo],
395
+ zDiffCmd, ignoreEolWs);
369396
iFrom++;
370397
iTo++;
371398
}
372399
}
373400
manifest_clear(&mFrom);
374401
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -312,10 +312,42 @@
312 diff_file_mem(&v1, &v2, zName, zDiffCmd, ignoreEolWs);
313 blob_reset(&v1);
314 blob_reset(&v2);
315 blob_reset(&fname);
316 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
318 /*
319 ** Output the differences between two check-ins.
320 */
321 static void diff_all_two_versions(
@@ -325,16 +357,16 @@
325 int diffFlags
326 ){
327 Manifest mFrom, mTo;
328 int iFrom, iTo;
329 int ignoreEolWs = (diffFlags & DIFF_NOEOLWS)!=0 ? 1 : 0;
330 /* int asNewFlag = (diffFlags & DIFF_NEWFILE)!=0 ? 1 : 0; */
331
332 manifest_from_name(zFrom, &mFrom);
333 manifest_from_name(zTo, &mTo);
334 iFrom = iTo = 0;
335 while( iFrom<mFrom.nFile && iTo<mTo.nFile ){
336 int cmp;
337 if( iFrom>=mFrom.nFile ){
338 cmp = +1;
339 }else if( iTo>=mTo.nFile ){
340 cmp = -1;
@@ -341,33 +373,28 @@
341 }else{
342 cmp = strcmp(mFrom.aFile[iFrom].zName, mTo.aFile[iTo].zName);
343 }
344 if( cmp<0 ){
345 printf("DELETED %s\n", mFrom.aFile[iFrom].zName);
 
 
 
346 iFrom++;
347 }else if( cmp>0 ){
348 printf("ADDED %s\n", mTo.aFile[iTo].zName);
 
 
 
349 iTo++;
350 }else if( strcmp(mFrom.aFile[iFrom].zUuid, mTo.aFile[iTo].zUuid)==0 ){
351 /* No changes */
352 iFrom++;
353 iTo++;
354 }else{
355 Blob f1, f2;
356 int rid;
357 printf("CHANGED %s\n", mFrom.aFile[iFrom].zName);
358 printf("Index: %s\n======================================="
359 "============================\n",
360 mFrom.aFile[iFrom].zName
361 );
362 rid = uuid_to_rid(mFrom.aFile[iFrom].zUuid, 0);
363 content_get(rid, &f1);
364 rid = uuid_to_rid(mTo.aFile[iTo].zUuid, 0);
365 content_get(rid, &f2);
366 diff_file_mem(&f1, &f2, mFrom.aFile[iFrom].zName, zDiffCmd, ignoreEolWs);
367 blob_reset(&f1);
368 blob_reset(&f2);
369 iFrom++;
370 iTo++;
371 }
372 }
373 manifest_clear(&mFrom);
374
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -312,10 +312,42 @@
312 diff_file_mem(&v1, &v2, zName, zDiffCmd, ignoreEolWs);
313 blob_reset(&v1);
314 blob_reset(&v2);
315 blob_reset(&fname);
316 }
317
318 /*
319 ** Show the difference between two files identified by ManifestFile
320 ** entries.
321 */
322 static void diff_manifest_entry(
323 struct ManifestFile *pFrom,
324 struct ManifestFile *pTo,
325 const char *zDiffCmd,
326 int ignoreEolWs
327 ){
328 Blob f1, f2;
329 int rid;
330 const char *zName = pFrom ? pFrom->zName : pTo->zName;
331 printf("Index: %s\n======================================="
332 "============================\n", zName);
333 if( pFrom ){
334 rid = uuid_to_rid(pFrom->zUuid, 0);
335 content_get(rid, &f1);
336 }else{
337 blob_zero(&f1);
338 }
339 if( pTo ){
340 rid = uuid_to_rid(pTo->zUuid, 0);
341 content_get(rid, &f2);
342 }else{
343 blob_zero(&f2);
344 }
345 diff_file_mem(&f1, &f2, zName, zDiffCmd, ignoreEolWs);
346 blob_reset(&f1);
347 blob_reset(&f2);
348 }
349
350 /*
351 ** Output the differences between two check-ins.
352 */
353 static void diff_all_two_versions(
@@ -325,16 +357,16 @@
357 int diffFlags
358 ){
359 Manifest mFrom, mTo;
360 int iFrom, iTo;
361 int ignoreEolWs = (diffFlags & DIFF_NOEOLWS)!=0 ? 1 : 0;
362 int asNewFlag = (diffFlags & DIFF_NEWFILE)!=0 ? 1 : 0;
363
364 manifest_from_name(zFrom, &mFrom);
365 manifest_from_name(zTo, &mTo);
366 iFrom = iTo = 0;
367 while( iFrom<mFrom.nFile || iTo<mTo.nFile ){
368 int cmp;
369 if( iFrom>=mFrom.nFile ){
370 cmp = +1;
371 }else if( iTo>=mTo.nFile ){
372 cmp = -1;
@@ -341,33 +373,28 @@
373 }else{
374 cmp = strcmp(mFrom.aFile[iFrom].zName, mTo.aFile[iTo].zName);
375 }
376 if( cmp<0 ){
377 printf("DELETED %s\n", mFrom.aFile[iFrom].zName);
378 if( asNewFlag ){
379 diff_manifest_entry(&mFrom.aFile[iFrom], 0, zDiffCmd, ignoreEolWs);
380 }
381 iFrom++;
382 }else if( cmp>0 ){
383 printf("ADDED %s\n", mTo.aFile[iTo].zName);
384 if( asNewFlag ){
385 diff_manifest_entry(0, &mTo.aFile[iTo], zDiffCmd, ignoreEolWs);
386 }
387 iTo++;
388 }else if( strcmp(mFrom.aFile[iFrom].zUuid, mTo.aFile[iTo].zUuid)==0 ){
389 /* No changes */
390 iFrom++;
391 iTo++;
392 }else{
 
 
393 printf("CHANGED %s\n", mFrom.aFile[iFrom].zName);
394 diff_manifest_entry(&mFrom.aFile[iFrom], &mTo.aFile[iTo],
395 zDiffCmd, ignoreEolWs);
 
 
 
 
 
 
 
 
 
396 iFrom++;
397 iTo++;
398 }
399 }
400 manifest_clear(&mFrom);
401
+38 -28
--- src/info.c
+++ src/info.c
@@ -234,14 +234,26 @@
234234
235235
236236
/*
237237
** Append the difference between two RIDs to the output
238238
*/
239
-static void append_diff(int fromid, int toid){
239
+static void append_diff(const char *zFrom, const char *zTo){
240
+ int fromid;
241
+ int toid;
240242
Blob from, to, out;
241
- content_get(fromid, &from);
242
- content_get(toid, &to);
243
+ if( zFrom ){
244
+ fromid = uuid_to_rid(zFrom, 0);
245
+ content_get(fromid, &from);
246
+ }else{
247
+ blob_zero(&from);
248
+ }
249
+ if( zTo ){
250
+ toid = uuid_to_rid(zTo, 0);
251
+ content_get(toid, &to);
252
+ }else{
253
+ blob_zero(&to);
254
+ }
243255
blob_zero(&out);
244256
text_diff(&from, &to, &out, 5, 1);
245257
@ %h(blob_str(&out))
246258
blob_reset(&from);
247259
blob_reset(&to);
@@ -263,39 +275,37 @@
263275
@ <p>Deleted %h(zName)</p>
264276
}else if( zOld==0 ){
265277
@ <p>Added %h(zName)</p>
266278
}else{
267279
@ <p>Changes to %h(zName)</p>
268
- if( showDiff ){
269
- int rid1 = uuid_to_rid(zOld, 0);
270
- int rid2 = uuid_to_rid(zNew, 0);
271
- @ <blockquote><pre>
272
- append_diff(rid1, rid2);
273
- @ </pre></blockquote>
274
- }
275
- }
276
- }else if( zOld && zNew ){
277
- @ <p>Modified <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
278
- @ from <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
279
- @ to <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)].</a>
280
- if( !showDiff ){
280
+ }
281
+ if( showDiff ){
282
+ @ <blockquote><pre>
283
+ append_diff(zOld, zNew);
284
+ @ </pre></blockquote>
285
+ }
286
+ }else{
287
+ if( zOld && zNew ){
288
+ @ <p>Modified <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
289
+ @ from <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
290
+ @ to <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)].</a>
291
+ }else if( zOld ){
292
+ @ <p>Deleted <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
293
+ @ version <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
294
+ }else{
295
+ @ <p>Added <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
296
+ @ version <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)]</a>
297
+ }
298
+ if( showDiff ){
299
+ @ <blockquote><pre>
300
+ append_diff(zOld, zNew);
301
+ @ </pre></blockquote>
302
+ }else if( zOld && zNew ){
281303
@ &nbsp;&nbsp;
282304
@ <a href="%s(g.zTop)/fdiff?v1=%S(zOld)&amp;v2=%S(zNew)">[diff]</a>
283
- }else{
284
- int rid1 = uuid_to_rid(zOld, 0);
285
- int rid2 = uuid_to_rid(zNew, 0);
286
- @ <blockquote><pre>
287
- append_diff(rid1, rid2);
288
- @ </pre></blockquote>
289305
}
290306
@ </p>
291
- }else if( zOld ){
292
- @ <p>Deleted <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
293
- @ version <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a></p>
294
- }else{
295
- @ <p>Added <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
296
- @ version <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)]</a></p>
297307
}
298308
}
299309
300310
301311
/*
302312
--- src/info.c
+++ src/info.c
@@ -234,14 +234,26 @@
234
235
236 /*
237 ** Append the difference between two RIDs to the output
238 */
239 static void append_diff(int fromid, int toid){
 
 
240 Blob from, to, out;
241 content_get(fromid, &from);
242 content_get(toid, &to);
 
 
 
 
 
 
 
 
 
 
243 blob_zero(&out);
244 text_diff(&from, &to, &out, 5, 1);
245 @ %h(blob_str(&out))
246 blob_reset(&from);
247 blob_reset(&to);
@@ -263,39 +275,37 @@
263 @ <p>Deleted %h(zName)</p>
264 }else if( zOld==0 ){
265 @ <p>Added %h(zName)</p>
266 }else{
267 @ <p>Changes to %h(zName)</p>
268 if( showDiff ){
269 int rid1 = uuid_to_rid(zOld, 0);
270 int rid2 = uuid_to_rid(zNew, 0);
271 @ <blockquote><pre>
272 append_diff(rid1, rid2);
273 @ </pre></blockquote>
274 }
275 }
276 }else if( zOld && zNew ){
277 @ <p>Modified <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
278 @ from <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
279 @ to <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)].</a>
280 if( !showDiff ){
 
 
 
 
 
 
 
 
 
 
281 @ &nbsp;&nbsp;
282 @ <a href="%s(g.zTop)/fdiff?v1=%S(zOld)&amp;v2=%S(zNew)">[diff]</a>
283 }else{
284 int rid1 = uuid_to_rid(zOld, 0);
285 int rid2 = uuid_to_rid(zNew, 0);
286 @ <blockquote><pre>
287 append_diff(rid1, rid2);
288 @ </pre></blockquote>
289 }
290 @ </p>
291 }else if( zOld ){
292 @ <p>Deleted <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
293 @ version <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a></p>
294 }else{
295 @ <p>Added <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
296 @ version <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)]</a></p>
297 }
298 }
299
300
301 /*
302
--- src/info.c
+++ src/info.c
@@ -234,14 +234,26 @@
234
235
236 /*
237 ** Append the difference between two RIDs to the output
238 */
239 static void append_diff(const char *zFrom, const char *zTo){
240 int fromid;
241 int toid;
242 Blob from, to, out;
243 if( zFrom ){
244 fromid = uuid_to_rid(zFrom, 0);
245 content_get(fromid, &from);
246 }else{
247 blob_zero(&from);
248 }
249 if( zTo ){
250 toid = uuid_to_rid(zTo, 0);
251 content_get(toid, &to);
252 }else{
253 blob_zero(&to);
254 }
255 blob_zero(&out);
256 text_diff(&from, &to, &out, 5, 1);
257 @ %h(blob_str(&out))
258 blob_reset(&from);
259 blob_reset(&to);
@@ -263,39 +275,37 @@
275 @ <p>Deleted %h(zName)</p>
276 }else if( zOld==0 ){
277 @ <p>Added %h(zName)</p>
278 }else{
279 @ <p>Changes to %h(zName)</p>
280 }
281 if( showDiff ){
282 @ <blockquote><pre>
283 append_diff(zOld, zNew);
284 @ </pre></blockquote>
285 }
286 }else{
287 if( zOld && zNew ){
288 @ <p>Modified <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
289 @ from <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
290 @ to <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)].</a>
291 }else if( zOld ){
292 @ <p>Deleted <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
293 @ version <a href="%s(g.zTop)/artifact/%s(zOld)">[%S(zOld)]</a>
294 }else{
295 @ <p>Added <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
296 @ version <a href="%s(g.zTop)/artifact/%s(zNew)">[%S(zNew)]</a>
297 }
298 if( showDiff ){
299 @ <blockquote><pre>
300 append_diff(zOld, zNew);
301 @ </pre></blockquote>
302 }else if( zOld && zNew ){
303 @ &nbsp;&nbsp;
304 @ <a href="%s(g.zTop)/fdiff?v1=%S(zOld)&amp;v2=%S(zNew)">[diff]</a>
 
 
 
 
 
 
305 }
306 @ </p>
 
 
 
 
 
 
307 }
308 }
309
310
311 /*
312
+1 -1
--- src/manifest.c
+++ src/manifest.c
@@ -54,11 +54,11 @@
5454
char *zAttachName; /* Filename of an attachment. A card. */
5555
char *zAttachSrc; /* UUID of document being attached. A card. */
5656
char *zAttachTarget; /* Ticket or wiki that attachment applies to. A card */
5757
int nFile; /* Number of F cards */
5858
int nFileAlloc; /* Slots allocated in aFile[] */
59
- struct {
59
+ struct ManifestFile {
6060
char *zName; /* Name of a file */
6161
char *zUuid; /* UUID of the file */
6262
char *zPerm; /* File permissions */
6363
char *zPrior; /* Prior name if the name was changed */
6464
int iRename; /* index of renamed name in prior/next manifest */
6565
--- src/manifest.c
+++ src/manifest.c
@@ -54,11 +54,11 @@
54 char *zAttachName; /* Filename of an attachment. A card. */
55 char *zAttachSrc; /* UUID of document being attached. A card. */
56 char *zAttachTarget; /* Ticket or wiki that attachment applies to. A card */
57 int nFile; /* Number of F cards */
58 int nFileAlloc; /* Slots allocated in aFile[] */
59 struct {
60 char *zName; /* Name of a file */
61 char *zUuid; /* UUID of the file */
62 char *zPerm; /* File permissions */
63 char *zPrior; /* Prior name if the name was changed */
64 int iRename; /* index of renamed name in prior/next manifest */
65
--- src/manifest.c
+++ src/manifest.c
@@ -54,11 +54,11 @@
54 char *zAttachName; /* Filename of an attachment. A card. */
55 char *zAttachSrc; /* UUID of document being attached. A card. */
56 char *zAttachTarget; /* Ticket or wiki that attachment applies to. A card */
57 int nFile; /* Number of F cards */
58 int nFileAlloc; /* Slots allocated in aFile[] */
59 struct ManifestFile {
60 char *zName; /* Name of a file */
61 char *zUuid; /* UUID of the file */
62 char *zPerm; /* File permissions */
63 char *zPrior; /* Prior name if the name was changed */
64 int iRename; /* index of renamed name in prior/next manifest */
65

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button