Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Fix an inefficiency in uv-sync in which the uv-catalog is always sent even if the uv-hash matches. Also add preliminary change to support uv-push. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
d015a269e63fe4c34bc16e41cd266958 |
| User & Date: | drh 2021-07-06 13:15:33.465 |
Context
|
2021-07-06
| ||
| 13:46 | Only issue the warning about unable to push UV content due to insufficient privilege if the client has new UV content that otherwise might push. check-in: 22005dfcf1 user: drh tags: trunk | |
| 13:15 | Fix an inefficiency in uv-sync in which the uv-catalog is always sent even if the uv-hash matches. Also add preliminary change to support uv-push. check-in: d015a269e6 user: drh tags: trunk | |
|
2021-07-05
| ||
| 20:44 | In the ssh command for the "fossil ui REMOTE" command, add a space between the -L option and its argument, as this is required by plink. check-in: 3fd84de3f4 user: drh tags: trunk | |
Changes
Changes to src/blob.c.
| ︙ | ︙ | |||
458 459 460 461 462 463 464 |
/*
** Compare a blob to a string. Return TRUE if they are equal.
*/
int blob_eq_str(Blob *pBlob, const char *z, int n){
Blob t;
blob_is_init(pBlob);
| | | 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 |
/*
** Compare a blob to a string. Return TRUE if they are equal.
*/
int blob_eq_str(Blob *pBlob, const char *z, int n){
Blob t;
blob_is_init(pBlob);
if( n<=0 ) n = (int)strlen(z);
t.aData = (char*)z;
t.nUsed = n;
t.xRealloc = blobReallocStatic;
return blob_compare(pBlob, &t)==0;
}
/*
|
| ︙ | ︙ |
Changes to src/xfer.c.
| ︙ | ︙ | |||
1059 1060 1061 1062 1063 1064 1065 |
** pXfer is a "pragma uv-hash HASH" card.
**
** If HASH is different from the unversioned content hash on this server,
** then send a bunch of uvigot cards, one for each entry unversioned file
** on this server.
*/
static void send_unversioned_catalog(Xfer *pXfer){
| < < | | > | | | | | | | | | | | | | | < | 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 |
** pXfer is a "pragma uv-hash HASH" card.
**
** If HASH is different from the unversioned content hash on this server,
** then send a bunch of uvigot cards, one for each entry unversioned file
** on this server.
*/
static void send_unversioned_catalog(Xfer *pXfer){
int nUvIgot = 0;
Stmt uvq;
unversioned_schema();
db_prepare(&uvq,
"SELECT name, mtime, hash, sz FROM unversioned"
);
while( db_step(&uvq)==SQLITE_ROW ){
const char *zName = db_column_text(&uvq,0);
sqlite3_int64 mtime = db_column_int64(&uvq,1);
const char *zHash = db_column_text(&uvq,2);
int sz = db_column_int(&uvq,3);
nUvIgot++;
if( zHash==0 ){ sz = 0; zHash = "-"; }
blob_appendf(pXfer->pOut, "uvigot %s %lld %s %d\n",
zName, mtime, zHash, sz);
}
db_finalize(&uvq);
}
/*
** Called when there is an attempt to transfer private content to and
** from a server without authorization.
*/
static void server_private_xfer_not_authorized(void){
|
| ︙ | ︙ | |||
1614 1615 1616 1617 1618 1619 1620 |
** The client wants to make sure that unversioned files are all synced.
** If the HASH does not match, send a complete catalog of
** "uvigot" cards.
*/
if( blob_eq(&xfer.aToken[1], "uv-hash")
&& blob_is_hname(&xfer.aToken[2])
){
| | > > > | < < > | 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 |
** The client wants to make sure that unversioned files are all synced.
** If the HASH does not match, send a complete catalog of
** "uvigot" cards.
*/
if( blob_eq(&xfer.aToken[1], "uv-hash")
&& blob_is_hname(&xfer.aToken[2])
){
if( !uvCatalogSent
&& g.perm.Read
&& !blob_eq_str(&xfer.aToken[2], unversioned_content_hash(0),-1)
){
if( g.perm.WrUnver ){
@ pragma uv-push-ok
}else if( g.perm.Read ){
@ pragma uv-pull-only
}
send_unversioned_catalog(&xfer);
}
uvCatalogSent = 1;
}
/* pragma ci-lock CHECKIN-HASH CLIENT-ID
**
** The client wants to make non-branch commit against the check-in
|
| ︙ | ︙ | |||
1811 1812 1813 1814 1815 1816 1817 | */ #define SYNC_PUSH 0x0001 /* push content client to server */ #define SYNC_PULL 0x0002 /* pull content server to client */ #define SYNC_CLONE 0x0004 /* clone the repository */ #define SYNC_PRIVATE 0x0008 /* Also transfer private content */ #define SYNC_VERBOSE 0x0010 /* Extra diagnostics */ #define SYNC_RESYNC 0x0020 /* --verily */ | > > | | < | | | | | 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 |
*/
#define SYNC_PUSH 0x0001 /* push content client to server */
#define SYNC_PULL 0x0002 /* pull content server to client */
#define SYNC_CLONE 0x0004 /* clone the repository */
#define SYNC_PRIVATE 0x0008 /* Also transfer private content */
#define SYNC_VERBOSE 0x0010 /* Extra diagnostics */
#define SYNC_RESYNC 0x0020 /* --verily */
#define SYNC_UVPULL 0x0040 /* Unversioned pull */
#define SYNC_FROMPARENT 0x0080 /* Pull from the parent project */
#define SYNC_UNVERSIONED 0x0100 /* Sync unversioned content */
#define SYNC_UV_REVERT 0x0200 /* Copy server unversioned to client */
#define SYNC_UV_TRACE 0x0400 /* Describe UV activities */
#define SYNC_UV_DRYRUN 0x0800 /* Do not actually exchange files */
#define SYNC_IFABLE 0x1000 /* Inability to sync is not fatal */
#define SYNC_CKIN_LOCK 0x2000 /* Lock the current check-in */
#endif
/*
** Floating-point absolute value
*/
static double fossil_fabs(double x){
return x>0.0 ? x : -x;
|
| ︙ | ︙ | |||
1877 1878 1879 1880 1881 1882 1883 |
sqlite3_int64 mtime; /* Modification time on a UV file */
int autopushFailed = 0; /* Autopush following commit failed if true */
const char *zCkinLock; /* Name of check-in to lock. NULL for none */
const char *zClientId; /* A unique identifier for this check-out */
unsigned int mHttpFlags;/* Flags for the http_exchange() subsystem */
if( db_get_boolean("dont-push", 0) ) syncFlags &= ~SYNC_PUSH;
| | > | 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 |
sqlite3_int64 mtime; /* Modification time on a UV file */
int autopushFailed = 0; /* Autopush following commit failed if true */
const char *zCkinLock; /* Name of check-in to lock. NULL for none */
const char *zClientId; /* A unique identifier for this check-out */
unsigned int mHttpFlags;/* Flags for the http_exchange() subsystem */
if( db_get_boolean("dont-push", 0) ) syncFlags &= ~SYNC_PUSH;
if( (syncFlags & (SYNC_PUSH|SYNC_PULL|SYNC_CLONE|
SYNC_UNVERSIONED|SYNC_UVPULL))==0
&& configRcvMask==0 && configSendMask==0 ) return 0;
if( syncFlags & SYNC_FROMPARENT ){
configRcvMask = 0;
configSendMask = 0;
syncFlags &= ~(SYNC_PUSH);
zPCode = db_get("parent-project-code", 0);
if( zPCode==0 || db_get("parent-project-name",0)==0 ){
|
| ︙ | ︙ | |||
2034 2035 2036 2037 2038 2039 2040 |
configRcvMask = 0;
}
/* Client sends a request to sync unversioned files.
** On a clone, delay sending this until the second cycle since
** the login card might fail on the first cycle.
*/
| | | 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 |
configRcvMask = 0;
}
/* Client sends a request to sync unversioned files.
** On a clone, delay sending this until the second cycle since
** the login card might fail on the first cycle.
*/
if( (syncFlags & (SYNC_UNVERSIONED|SYNC_UVPULL))!=0
&& ((syncFlags & SYNC_CLONE)==0 || nCycle>0)
&& !uvHashSent
){
blob_appendf(&send, "pragma uv-hash %s\n", unversioned_content_hash(0));
nCardSent++;
uvHashSent = 1;
}
|
| ︙ | ︙ | |||
2490 2491 2492 2493 2494 2495 2496 |
**
** If the server is unwill to accept new unversioned content (because
** this client lacks the necessary permissions) then it sends a
** "uv-pull-only" pragma so that the client will know not to waste
** bandwidth trying to upload unversioned content. If the server
** does accept new unversioned content, it sends "uv-push-ok".
*/
| > | | | | | | | | | > | 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 |
**
** If the server is unwill to accept new unversioned content (because
** this client lacks the necessary permissions) then it sends a
** "uv-pull-only" pragma so that the client will know not to waste
** bandwidth trying to upload unversioned content. If the server
** does accept new unversioned content, it sends "uv-push-ok".
*/
if( syncFlags & SYNC_UNVERSIONED ){
if( blob_eq(&xfer.aToken[1], "uv-pull-only") ){
fossil_print(
"Warning: uv-pull-only \n"
" Unable to push unversioned content because you lack\n"
" sufficient permission on the server\n"
);
if( syncFlags & SYNC_UV_REVERT ) uvDoPush = 1;
}else if( blob_eq(&xfer.aToken[1], "uv-push-ok") ){
uvDoPush = 1;
}
}
/* pragma ci-lock-fail USER-HOLDING-LOCK LOCK-TIME
**
** The server generates this message when a "pragma ci-lock"
** is attempted on a check-in for which there is an existing
** lock. USER-HOLDING-LOCK is the name of the user who originated
|
| ︙ | ︙ |