Fossil SCM
Bug fix: If a repository contains public artifacts that are deltas from private artifacts, expand the artifact content prior to cloning.
Commit
8d155c5f1f89ebe97d8bf14e0eeba89c799526dd
Parent
697d6bfd8ed2fab…
1 file changed
+21
-8
+21
-8
| --- src/xfer.c | ||
| +++ src/xfer.c | ||
| @@ -443,43 +443,56 @@ | ||
| 443 | 443 | const char *zDelta; |
| 444 | 444 | int szU; |
| 445 | 445 | int szC; |
| 446 | 446 | int rc; |
| 447 | 447 | int isPrivate; |
| 448 | + int srcIsPrivate; | |
| 448 | 449 | static Stmt q1; |
| 450 | + Blob fullContent; | |
| 449 | 451 | |
| 450 | 452 | isPrivate = content_is_private(rid); |
| 451 | 453 | if( isPrivate && pXfer->syncPrivate==0 ) return; |
| 452 | 454 | 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" | |
| 459 | 460 | " AND NOT EXISTS(SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)" |
| 460 | 461 | ); |
| 461 | 462 | db_bind_int(&q1, ":rid", rid); |
| 462 | 463 | rc = db_step(&q1); |
| 463 | 464 | if( rc==SQLITE_ROW ){ |
| 464 | 465 | zUuid = db_column_text(&q1, 0); |
| 465 | 466 | szU = db_column_int(&q1, 1); |
| 466 | 467 | szC = db_column_bytes(&q1, 2); |
| 467 | 468 | 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); | |
| 469 | 471 | if( isPrivate ) blob_append(pXfer->pOut, "private\n", -1); |
| 470 | 472 | 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 ){ | |
| 472 | 482 | blob_appendf(pXfer->pOut, "%s ", zDelta); |
| 473 | 483 | pXfer->nDeltaSent++; |
| 474 | 484 | }else{ |
| 475 | 485 | pXfer->nFileSent++; |
| 476 | 486 | } |
| 477 | 487 | blob_appendf(pXfer->pOut, "%d %d\n", szU, szC); |
| 478 | 488 | blob_append(pXfer->pOut, zContent, szC); |
| 479 | 489 | if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){ |
| 480 | 490 | blob_appendf(pXfer->pOut, "\n", 1); |
| 491 | + } | |
| 492 | + if( !isPrivate && srcIsPrivate ){ | |
| 493 | + blob_reset(&fullContent); | |
| 481 | 494 | } |
| 482 | 495 | } |
| 483 | 496 | db_reset(&q1); |
| 484 | 497 | } |
| 485 | 498 | |
| 486 | 499 |
| --- 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 |