Fossil SCM

Bug fix: If a repository contains public artifacts that are deltas from private artifacts, expand the artifact content prior to cloning.

drh 2011-11-30 17:26 trunk
Commit 8d155c5f1f89ebe97d8bf14e0eeba89c799526dd
1 file changed +21 -8
+21 -8
--- src/xfer.c
+++ src/xfer.c
@@ -443,43 +443,56 @@
443443
const char *zDelta;
444444
int szU;
445445
int szC;
446446
int rc;
447447
int isPrivate;
448
+ int srcIsPrivate;
448449
static Stmt q1;
450
+ Blob fullContent;
449451
450452
isPrivate = content_is_private(rid);
451453
if( isPrivate && pXfer->syncPrivate==0 ) return;
452454
db_static_prepare(&q1,
453
- "SELECT uuid, size, content,"
454
- " (SELECT uuid FROM delta, blob"
455
- " WHERE delta.rid=:rid AND delta.srcid=blob.rid)"
456
- " FROM blob"
457
- " WHERE rid=:rid"
458
- " AND size>=0"
455
+ "SELECT uuid, size, content, delta.srcid IN private,"
456
+ " (SELECT uuid FROM blob WHERE rid=delta.srcid)"
457
+ " FROM blob LEFT JOIN delta ON (blob.rid=delta.rid)"
458
+ " WHERE blob.rid=:rid"
459
+ " AND blob.size>=0"
459460
" AND NOT EXISTS(SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)"
460461
);
461462
db_bind_int(&q1, ":rid", rid);
462463
rc = db_step(&q1);
463464
if( rc==SQLITE_ROW ){
464465
zUuid = db_column_text(&q1, 0);
465466
szU = db_column_int(&q1, 1);
466467
szC = db_column_bytes(&q1, 2);
467468
zContent = db_column_raw(&q1, 2);
468
- zDelta = db_column_text(&q1, 3);
469
+ srcIsPrivate = db_column_int(&q1, 3);
470
+ zDelta = db_column_text(&q1, 4);
469471
if( isPrivate ) blob_append(pXfer->pOut, "private\n", -1);
470472
blob_appendf(pXfer->pOut, "cfile %s ", zUuid);
471
- if( zDelta ){
473
+ if( !isPrivate && srcIsPrivate ){
474
+ content_get(rid, &fullContent);
475
+ szU = blob_size(&fullContent);
476
+ blob_compress(&fullContent, &fullContent);
477
+ szC = blob_size(&fullContent);
478
+ zContent = blob_buffer(&fullContent);
479
+ zDelta = 0;
480
+ }
481
+ if( zDelta ){
472482
blob_appendf(pXfer->pOut, "%s ", zDelta);
473483
pXfer->nDeltaSent++;
474484
}else{
475485
pXfer->nFileSent++;
476486
}
477487
blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
478488
blob_append(pXfer->pOut, zContent, szC);
479489
if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
480490
blob_appendf(pXfer->pOut, "\n", 1);
491
+ }
492
+ if( !isPrivate && srcIsPrivate ){
493
+ blob_reset(&fullContent);
481494
}
482495
}
483496
db_reset(&q1);
484497
}
485498
486499
--- src/xfer.c
+++ src/xfer.c
@@ -443,43 +443,56 @@
443 const char *zDelta;
444 int szU;
445 int szC;
446 int rc;
447 int isPrivate;
 
448 static Stmt q1;
 
449
450 isPrivate = content_is_private(rid);
451 if( isPrivate && pXfer->syncPrivate==0 ) return;
452 db_static_prepare(&q1,
453 "SELECT uuid, size, content,"
454 " (SELECT uuid FROM delta, blob"
455 " WHERE delta.rid=:rid AND delta.srcid=blob.rid)"
456 " FROM blob"
457 " WHERE rid=:rid"
458 " AND size>=0"
459 " AND NOT EXISTS(SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)"
460 );
461 db_bind_int(&q1, ":rid", rid);
462 rc = db_step(&q1);
463 if( rc==SQLITE_ROW ){
464 zUuid = db_column_text(&q1, 0);
465 szU = db_column_int(&q1, 1);
466 szC = db_column_bytes(&q1, 2);
467 zContent = db_column_raw(&q1, 2);
468 zDelta = db_column_text(&q1, 3);
 
469 if( isPrivate ) blob_append(pXfer->pOut, "private\n", -1);
470 blob_appendf(pXfer->pOut, "cfile %s ", zUuid);
471 if( zDelta ){
 
 
 
 
 
 
 
 
472 blob_appendf(pXfer->pOut, "%s ", zDelta);
473 pXfer->nDeltaSent++;
474 }else{
475 pXfer->nFileSent++;
476 }
477 blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
478 blob_append(pXfer->pOut, zContent, szC);
479 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
480 blob_appendf(pXfer->pOut, "\n", 1);
 
 
 
481 }
482 }
483 db_reset(&q1);
484 }
485
486
--- src/xfer.c
+++ src/xfer.c
@@ -443,43 +443,56 @@
443 const char *zDelta;
444 int szU;
445 int szC;
446 int rc;
447 int isPrivate;
448 int srcIsPrivate;
449 static Stmt q1;
450 Blob fullContent;
451
452 isPrivate = content_is_private(rid);
453 if( isPrivate && pXfer->syncPrivate==0 ) return;
454 db_static_prepare(&q1,
455 "SELECT uuid, size, content, delta.srcid IN private,"
456 " (SELECT uuid FROM blob WHERE rid=delta.srcid)"
457 " FROM blob LEFT JOIN delta ON (blob.rid=delta.rid)"
458 " WHERE blob.rid=:rid"
459 " AND blob.size>=0"
 
460 " AND NOT EXISTS(SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)"
461 );
462 db_bind_int(&q1, ":rid", rid);
463 rc = db_step(&q1);
464 if( rc==SQLITE_ROW ){
465 zUuid = db_column_text(&q1, 0);
466 szU = db_column_int(&q1, 1);
467 szC = db_column_bytes(&q1, 2);
468 zContent = db_column_raw(&q1, 2);
469 srcIsPrivate = db_column_int(&q1, 3);
470 zDelta = db_column_text(&q1, 4);
471 if( isPrivate ) blob_append(pXfer->pOut, "private\n", -1);
472 blob_appendf(pXfer->pOut, "cfile %s ", zUuid);
473 if( !isPrivate && srcIsPrivate ){
474 content_get(rid, &fullContent);
475 szU = blob_size(&fullContent);
476 blob_compress(&fullContent, &fullContent);
477 szC = blob_size(&fullContent);
478 zContent = blob_buffer(&fullContent);
479 zDelta = 0;
480 }
481 if( zDelta ){
482 blob_appendf(pXfer->pOut, "%s ", zDelta);
483 pXfer->nDeltaSent++;
484 }else{
485 pXfer->nFileSent++;
486 }
487 blob_appendf(pXfer->pOut, "%d %d\n", szU, szC);
488 blob_append(pXfer->pOut, zContent, szC);
489 if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
490 blob_appendf(pXfer->pOut, "\n", 1);
491 }
492 if( !isPrivate && srcIsPrivate ){
493 blob_reset(&fullContent);
494 }
495 }
496 db_reset(&q1);
497 }
498
499

Keyboard Shortcuts

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