| | @@ -89,14 +89,11 @@ |
| 89 | 89 | p = path.pAll; |
| 90 | 90 | path.pAll = p->pAll; |
| 91 | 91 | fossil_free(p); |
| 92 | 92 | } |
| 93 | 93 | bag_clear(&path.seen); |
| 94 | | - path.pCurrent = 0; |
| 95 | | - path.pAll = 0; |
| 96 | | - path.pEnd = 0; |
| 97 | | - path.nStep = 0; |
| 94 | + memset(&path, 0, sizeof(&path)); |
| 98 | 95 | } |
| 99 | 96 | |
| 100 | 97 | /* |
| 101 | 98 | ** Construct the path from path.pStart to path.pEnd in the u.pTo fields. |
| 102 | 99 | */ |
| | @@ -213,11 +210,11 @@ |
| 213 | 210 | z = db_text(0, |
| 214 | 211 | "SELECT substr(uuid,1,12) || ' ' || datetime(mtime)" |
| 215 | 212 | " FROM blob, event" |
| 216 | 213 | " WHERE blob.rid=%d AND event.objid=%d AND event.type='ci'", |
| 217 | 214 | p->rid, p->rid); |
| 218 | | - fossil_print("%4d: %s", n, z); |
| 215 | + fossil_print("%4d: %5d %s", n, p->rid, z); |
| 219 | 216 | fossil_free(z); |
| 220 | 217 | if( p->u.pTo ){ |
| 221 | 218 | fossil_print(" is a %s of\n", |
| 222 | 219 | p->u.pTo->fromIsParent ? "parent" : "child"); |
| 223 | 220 | }else{ |
| | @@ -313,11 +310,11 @@ |
| 313 | 310 | z = db_text(0, |
| 314 | 311 | "SELECT substr(uuid,1,12) || ' ' || datetime(mtime)" |
| 315 | 312 | " FROM blob, event" |
| 316 | 313 | " WHERE blob.rid=%d AND event.objid=%d AND event.type='ci'", |
| 317 | 314 | p->rid, p->rid); |
| 318 | | - fossil_print("%4d: %s", n, z); |
| 315 | + fossil_print("%4d: %5d %s", n, p->rid, z); |
| 319 | 316 | fossil_free(z); |
| 320 | 317 | if( p->rid==iFrom ) fossil_print(" VERSION1"); |
| 321 | 318 | if( p->rid==iTo ) fossil_print(" VERSION2"); |
| 322 | 319 | if( p->rid==iPivot ) fossil_print(" PIVOT"); |
| 323 | 320 | fossil_print("\n"); |
| | @@ -340,25 +337,28 @@ |
| 340 | 337 | ** Compute all file name changes that occur going from checkin iFrom |
| 341 | 338 | ** to checkin iTo. |
| 342 | 339 | ** |
| 343 | 340 | ** The number of name changes is written into *pnChng. For each name |
| 344 | 341 | ** change, two integers are allocated for *piChng. The first is the |
| 345 | | -** filename.fnid for the original name and the second is for new name. |
| 342 | +** filename.fnid for the original name as seen in check-in iFrom and |
| 343 | +** the second is for new name as it is used in check-in iTo. |
| 344 | +** |
| 346 | 345 | ** Space to hold *piChng is obtained from fossil_malloc() and should |
| 347 | 346 | ** be released by the caller. |
| 348 | 347 | ** |
| 349 | | -** This routine really has nothing to do with pathion. It is located |
| 348 | +** This routine really has nothing to do with path. It is located |
| 350 | 349 | ** in this path.c module in order to leverage some of the path |
| 351 | 350 | ** infrastructure. |
| 352 | 351 | */ |
| 353 | 352 | void find_filename_changes( |
| 354 | | - int iFrom, |
| 355 | | - int iTo, |
| 356 | | - int *pnChng, |
| 357 | | - int **aiChng |
| 353 | + int iFrom, /* Ancestor check-in */ |
| 354 | + int iTo, /* Recent check-in */ |
| 355 | + int *pnChng, /* Number of name changes along the path */ |
| 356 | + int **aiChng, /* Name changes */ |
| 357 | + const char *zDebug /* Generate trace output if no NULL */ |
| 358 | 358 | ){ |
| 359 | | - PathNode *p; /* For looping over path from iFrom to iTo */ |
| 359 | + PathNode *p; /* For looping over path from iFrom to iTo */ |
| 360 | 360 | NameChange *pAll = 0; /* List of all name changes seen so far */ |
| 361 | 361 | NameChange *pChng; /* For looping through the name change list */ |
| 362 | 362 | int nChng = 0; /* Number of files whose names have changed */ |
| 363 | 363 | int *aChng; /* Two integers per name change */ |
| 364 | 364 | int i; /* Loop counter */ |
| | @@ -387,10 +387,19 @@ |
| 387 | 387 | pfnid = db_column_int(&q1, 0); |
| 388 | 388 | }else{ |
| 389 | 389 | fnid = db_column_int(&q1, 0); |
| 390 | 390 | pfnid = db_column_int(&q1, 1); |
| 391 | 391 | } |
| 392 | + if( zDebug ){ |
| 393 | + fossil_print("%s at %d %.10z: %d[%z] -> %d[%z]\n", |
| 394 | + zDebug, p->rid, |
| 395 | + db_text(0, "SELECT uuid FROM blob WHERE rid=%d", p->rid), |
| 396 | + pfnid, |
| 397 | + db_text(0, "SELECT name FROM filename WHERE fnid=%d", pfnid), |
| 398 | + fnid, |
| 399 | + db_text(0, "SELECT name FROM filename WHERE fnid=%d", fnid)); |
| 400 | + } |
| 392 | 401 | for(pChng=pAll; pChng; pChng=pChng->pNext){ |
| 393 | 402 | if( pChng->curName==pfnid ){ |
| 394 | 403 | pChng->newName = fnid; |
| 395 | 404 | break; |
| 396 | 405 | } |
| | @@ -413,10 +422,18 @@ |
| 413 | 422 | *pnChng = nChng; |
| 414 | 423 | aChng = *aiChng = fossil_malloc( nChng*2*sizeof(int) ); |
| 415 | 424 | for(pChng=pAll, i=0; pChng; pChng=pChng->pNext, i+=2){ |
| 416 | 425 | aChng[i] = pChng->origName; |
| 417 | 426 | aChng[i+1] = pChng->newName; |
| 427 | + if( zDebug ){ |
| 428 | + fossil_print("%s summary %d[%z] -> %d[%z]\n", |
| 429 | + zDebug, |
| 430 | + aChng[i], |
| 431 | + db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i]), |
| 432 | + aChng[i+1], |
| 433 | + db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i+1])); |
| 434 | + } |
| 418 | 435 | } |
| 419 | 436 | while( pAll ){ |
| 420 | 437 | pChng = pAll; |
| 421 | 438 | pAll = pAll->pNext; |
| 422 | 439 | fossil_free(pChng); |
| | @@ -437,20 +454,26 @@ |
| 437 | 454 | int *aChng; |
| 438 | 455 | int nChng; |
| 439 | 456 | int i; |
| 440 | 457 | |
| 441 | 458 | db_find_and_open_repository(0,0); |
| 442 | | - if( g.argc!=4 ) usage("VERSION1 VERSION2"); |
| 443 | | - iFrom = name_to_rid(g.argv[2]); |
| 444 | | - iTo = name_to_rid(g.argv[3]); |
| 445 | | - find_filename_changes(iFrom, iTo, &nChng, &aChng); |
| 446 | | - for(i=0; i<nChng; i++){ |
| 447 | | - char *zFrom, *zTo; |
| 448 | | - |
| 449 | | - zFrom = db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i*2]); |
| 450 | | - zTo = db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i*2+1]); |
| 451 | | - fossil_print("[%s] -> [%s]\n", zFrom, zTo); |
| 452 | | - fossil_free(zFrom); |
| 453 | | - fossil_free(zTo); |
| 454 | | - } |
| 455 | | - fossil_free(aChng); |
| 459 | + if( g.argc<4 ) usage("VERSION1 VERSION2"); |
| 460 | + while( g.argc>=4 ){ |
| 461 | + iFrom = name_to_rid(g.argv[2]); |
| 462 | + iTo = name_to_rid(g.argv[3]); |
| 463 | + find_filename_changes(iFrom, iTo, &nChng, &aChng, 0); |
| 464 | + fossil_print("------ Changes for (%d) %s -> (%d) %s\n", |
| 465 | + iFrom, g.argv[2], iTo, g.argv[3]); |
| 466 | + for(i=0; i<nChng; i++){ |
| 467 | + char *zFrom, *zTo; |
| 468 | + |
| 469 | + zFrom = db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i*2]); |
| 470 | + zTo = db_text(0, "SELECT name FROM filename WHERE fnid=%d", aChng[i*2+1]); |
| 471 | + fossil_print("[%s] -> [%s]\n", zFrom, zTo); |
| 472 | + fossil_free(zFrom); |
| 473 | + fossil_free(zTo); |
| 474 | + } |
| 475 | + fossil_free(aChng); |
| 476 | + g.argv += 2; |
| 477 | + g.argc -= 2; |
| 478 | + } |
| 456 | 479 | } |
| 457 | 480 | |