Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Improvements to the graph layout algorithm yielding a more compact graph in many cases. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
ea61f4aa551df588f55f1734bea6bd60 |
| User & Date: | drh 2010-12-20 01:06:17.000 |
Context
|
2010-12-20
| ||
| 02:02 | Abort a clone and delete the new repository if the server for the clone returns an error during the sync. ... (check-in: f6263ed6ce user: drh tags: trunk) | |
| 01:06 | Improvements to the graph layout algorithm yielding a more compact graph in many cases. ... (check-in: ea61f4aa55 user: drh tags: trunk) | |
|
2010-12-19
| ||
| 21:08 | When an ambiguous command prefix is entered, report all possible matches as part of the error message. ... (check-in: 5ae54b39fd user: drh tags: trunk) | |
Changes
Changes to src/graph.c.
| ︙ | ︙ | |||
243 244 245 246 247 248 249 |
pCurrent->railInUse |= mask;
pPrior->aiRaiser[iRail] = pCurrent->idx;
while( pPrior->idx > pCurrent->idx ){
pPrior->railInUse |= mask;
pPrior = pPrior->pPrev;
assert( pPrior!=0 );
}
| < < < | 243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
pCurrent->railInUse |= mask;
pPrior->aiRaiser[iRail] = pCurrent->idx;
while( pPrior->idx > pCurrent->idx ){
pPrior->railInUse |= mask;
pPrior = pPrior->pPrev;
assert( pPrior!=0 );
}
}
}
/*
** Compute the complete graph
*/
|
| ︙ | ︙ | |||
378 379 380 381 382 383 384 |
pRow->railInUse = 1<<pRow->iRail;
continue;
}
pRow->iRail = findFreeRail(p, 0, pParent->idx, inUse, pParent->iRail);
pParent->aiRaiser[pRow->iRail] = pRow->idx;
}
mask = 1<<pRow->iRail;
| < | | | < | < | 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 |
pRow->railInUse = 1<<pRow->iRail;
continue;
}
pRow->iRail = findFreeRail(p, 0, pParent->idx, inUse, pParent->iRail);
pParent->aiRaiser[pRow->iRail] = pRow->idx;
}
mask = 1<<pRow->iRail;
pRow->railInUse |= mask;
if( pRow->pChild==0 ){
inUse &= ~mask;
}else{
inUse |= mask;
assignChildrenToRail(pRow);
}
if( pParent ){
for(pLoop=pParent->pPrev; pLoop && pLoop!=pRow; pLoop=pLoop->pPrev){
pLoop->railInUse |= mask;
}
}
}
/*
** Insert merge rails and merge arrows
*/
for(pRow=p->pFirst; pRow; pRow=pRow->pNext){
for(i=1; i<pRow->nParent; i++){
int parentRid = pRow->aParent[i];
pDesc = hashFind(p, parentRid);
if( pDesc==0 ) continue;
if( pDesc->mergeOut<0 ){
int iTarget = (pRow->iRail + pDesc->iRail)/2;
pDesc->mergeOut = findFreeRail(p, pRow->idx, pDesc->idx-1, 0, iTarget);
pDesc->mergeUpto = pRow->idx;
mask = 1<<pDesc->mergeOut;
for(pLoop=pRow->pNext; pLoop && pLoop->rid!=parentRid;
pLoop=pLoop->pNext){
pLoop->railInUse |= mask;
}
}
pRow->mergeIn |= 1<<pDesc->mergeOut;
}
}
/*
** Insert merge rails from primaries to duplicates.
*/
if( hasDup ){
for(pRow=p->pFirst; pRow; pRow=pRow->pNext){
if( !pRow->isDup ) continue;
pDesc = hashFind(p, pRow->rid);
assert( pDesc!=0 && pDesc!=pRow );
if( pDesc->mergeOut<0 ){
int iTarget = (pRow->iRail + pDesc->iRail)/2;
pDesc->mergeOut = findFreeRail(p, pRow->idx, pDesc->idx-1, 0, iTarget);
pDesc->mergeUpto = pRow->idx;
mask = 1<<pDesc->mergeOut;
for(pLoop=pRow->pNext; pLoop && pLoop!=pDesc; pLoop=pLoop->pNext){
pLoop->railInUse |= mask;
}
}
pRow->mergeIn |= 1<<pDesc->mergeOut;
}
}
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
460 461 462 463 464 465 466 |
@ }
@ if( p.mo>=0 ){
@ var x1 = p.mo*20 + left;
@ var y1 = p.y-3;
@ var x0 = x1>p.x ? p.x+7 : p.x-6;
@ var u = rowinfo[p.mu-1];
@ var y0 = u.y+5;
| > > > | > | | 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 |
@ }
@ if( p.mo>=0 ){
@ var x1 = p.mo*20 + left;
@ var y1 = p.y-3;
@ var x0 = x1>p.x ? p.x+7 : p.x-6;
@ var u = rowinfo[p.mu-1];
@ var y0 = u.y+5;
@ if( x1==p.x ){
@ y1 -= 2;
@ }else{
@ drawThinLine(x0,y1,x1,y1);
@ }
@ drawThinLine(x1,y0,x1,y1);
@ }
@ var n = p.au.length;
@ for(var i=0; i<n; i+=2){
@ var x1 = p.au[i]*20 + left;
@ var x0 = x1>p.x ? p.x+7 : p.x-6;
@ drawBox("black",x0,p.y,x1,p.y+1);
@ var u = rowinfo[p.au[i+1]-1];
@ drawUpArrow(x1, u.y+6, p.y);
@ }
@ for(var j in p.mi){
@ var y0 = p.y+5;
@ var mx = p.mi[j]*20 + left;
@ if( mx>p.x ){
@ drawThinArrow(y0,mx,p.x+6);
@ }else{
@ drawThinArrow(y0,mx,p.x-5);
@ }
@ }
@ }
@ function renderGraph(){
@ var canvasDiv = document.getElementById("canvas");
|
| ︙ | ︙ |
Changes to src/translate.c.
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** | | > | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** ** Input lines that begin with the "@" character are translated into ** either cgi_printf() statements or string literals and the ** translated code is written on standard output. ** ** The problem this program is attempt to solve is as follows: When ** writing CGI programs in C, we typically want to output a lot of HTML ** text to standard output. In pure C code, this involves doing a ** printf() with a big string containing all that text. But we have ** to insert special codes (ex: \n and \") for many common characters, ** which interferes with the readability of the HTML. |
| ︙ | ︙ |