| | @@ -271,11 +271,11 @@ |
| 271 | 271 | blob_reset(&content); |
| 272 | 272 | } |
| 273 | 273 | free(zFullName); |
| 274 | 274 | } |
| 275 | 275 | db_finalize(&q); |
| 276 | | - db_end_transaction(1); |
| 276 | + db_end_transaction(1); /* ROLLBACK */ |
| 277 | 277 | } |
| 278 | 278 | |
| 279 | 279 | /* |
| 280 | 280 | ** Output the differences between two versions of a single file. |
| 281 | 281 | ** zFrom and zTo are the check-ins containing the two file versions. |
| | @@ -305,10 +305,52 @@ |
| 305 | 305 | static void diff_all_two_versions( |
| 306 | 306 | const char *zFrom, |
| 307 | 307 | const char *zTo, |
| 308 | 308 | const char *zDiffCmd |
| 309 | 309 | ){ |
| 310 | + Manifest mFrom, mTo; |
| 311 | + int iFrom, iTo; |
| 312 | + |
| 313 | + manifest_from_name(zFrom, &mFrom); |
| 314 | + manifest_from_name(zTo, &mTo); |
| 315 | + iFrom = iTo = 0; |
| 316 | + while( iFrom<mFrom.nFile && iTo<mTo.nFile ){ |
| 317 | + int cmp; |
| 318 | + if( iFrom>=mFrom.nFile ){ |
| 319 | + cmp = +1; |
| 320 | + }else if( iTo>=mTo.nFile ){ |
| 321 | + cmp = -1; |
| 322 | + }else{ |
| 323 | + cmp = strcmp(mFrom.aFile[iFrom].zName, mTo.aFile[iTo].zName); |
| 324 | + } |
| 325 | + if( cmp<0 ){ |
| 326 | + printf("DELETED %s\n", mFrom.aFile[iFrom].zName); |
| 327 | + iFrom++; |
| 328 | + }else if( cmp>0 ){ |
| 329 | + printf("ADDED %s\n", mTo.aFile[iTo].zName); |
| 330 | + iTo++; |
| 331 | + }else if( strcmp(mFrom.aFile[iFrom].zUuid, mTo.aFile[iTo].zUuid)==0 ){ |
| 332 | + /* No changes */ |
| 333 | + iFrom++; |
| 334 | + iTo++; |
| 335 | + }else{ |
| 336 | + Blob f1, f2; |
| 337 | + int rid; |
| 338 | + printf("CHANGED %s\n", mFrom.aFile[iFrom].zName); |
| 339 | + rid = uuid_to_rid(mFrom.aFile[iFrom].zUuid, 0); |
| 340 | + content_get(rid, &f1); |
| 341 | + rid = uuid_to_rid(mTo.aFile[iTo].zUuid, 0); |
| 342 | + content_get(rid, &f2); |
| 343 | + diff_file_mem(&f1, &f2, mFrom.aFile[iFrom].zName, zDiffCmd); |
| 344 | + blob_reset(&f1); |
| 345 | + blob_reset(&f2); |
| 346 | + iFrom++; |
| 347 | + iTo++; |
| 348 | + } |
| 349 | + } |
| 350 | + manifest_clear(&mFrom); |
| 351 | + manifest_clear(&mTo); |
| 310 | 352 | } |
| 311 | 353 | |
| 312 | 354 | /* |
| 313 | 355 | ** COMMAND: diff |
| 314 | 356 | ** COMMAND: gdiff |
| | @@ -366,10 +408,9 @@ |
| 366 | 408 | zDiffCmd = db_get(isGDiff ? "gdiff-command" : "diff-command", 0); |
| 367 | 409 | } |
| 368 | 410 | if( g.argc==3 ){ |
| 369 | 411 | diff_one_two_versions(zFrom, zTo, zDiffCmd); |
| 370 | 412 | }else{ |
| 371 | | - fossil_fatal("--to on complete check-ins not yet implemented"); |
| 372 | 413 | diff_all_two_versions(zFrom, zTo, zDiffCmd); |
| 373 | 414 | } |
| 374 | 415 | } |
| 375 | 416 | } |
| 376 | 417 | |