@@ -49,11 +49,13 @@
49 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDanglingFile; /* Number of dangling deltas received */
50 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mxSend; /* Stop sending "file" when pOut reaches this size */
51 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int resync; /* Send igot cards for all holdings */
52 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 syncPrivate; /* True to enable syncing private content */
53 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 nextIsPrivate; /* If true, next "file" received is a private */
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u32 clientVersion; /* Version of the client software */
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 remoteVersion; /* Version of fossil running on the other side */
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 remoteDate; /* Date for specific client software edition */
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 remoteTime; /* Time of date correspoding on remoteDate */
55 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
time_t maxTime; /* Time when this transfer should be finished */
56 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
57 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -524,20 +526,19 @@
524 526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void send_file(Xfer *pXfer, int rid, Blob *pUuid, int nativeDelta){
525 527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob content, uuid;
526 528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int size = 0;
527 529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPriv = content_is_private(rid);
528 530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pXfer->syncPrivate==0 && isPriv ) return;
530 531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_exists("SELECT 1 FROM onremote WHERE rid=%d", rid) ){
531 532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
532 533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
533 534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&uuid);
534 535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_blob(&uuid, "SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid);
535 536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(&uuid)==0 ){
536 537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
537 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( blob_size(&uuid)>HNAME_LEN_SHA1 && pXfer->clientVersion<20000 ){
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&uuid)>HNAME_LEN_SHA1 && pXfer->remoteVersion<20000 ){
539 540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer_cannot_send_sha3_error(pXfer);
540 541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
541 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
542 543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pUuid ){
543 544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_compare(pUuid, &uuid)!=0 ){
@@ -548,10 +549,21 @@
548 549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUuid = &uuid;
549 550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
550 551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( uuid_is_shunned(blob_str(pUuid)) ){
551 552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&uuid);
552 553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isPriv && pXfer->syncPrivate==0 ){
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pXfer->remoteDate>=20200413 ){
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the artifact is private and we are not doing a private sync,
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at least tell the other side that the artifact exists and is
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** known to be private. But only do this for newer clients since
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** older ones will throw an error if they get a private igot card
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and private syncing is disallowed */
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pXfer->pOut, "igot %b 1\n", pUuid);
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
553 565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
554 566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pXfer->maxTime != -1 && time(NULL) >= pXfer->maxTime) ||
555 567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pXfer->mxSend<=blob_size(pXfer->pOut) ){
556 568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFormat = isPriv ? "igot %b 1\n" : "igot %b\n";
557 569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pXfer->pOut, zFormat /*works-like:"%b"*/, pUuid);
@@ -626,11 +638,11 @@
626 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
szC = db_column_bytes(&q1, 2);
627 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zContent = db_column_raw(&q1, 2);
628 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
srcIsPrivate = db_column_int(&q1, 3);
629 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDelta = db_column_text(&q1, 4);
630 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isPrivate ) blob_append(pXfer->pOut, "private\n", -1);
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pXfer->clientVersion<20000 && db_column_bytes(&q1,0)!=HNAME_LEN_SHA1 ){
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pXfer->remoteVersion<20000 && db_column_bytes(&q1,0)!=HNAME_LEN_SHA1 ){
632 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer_cannot_send_sha3_error(pXfer);
633 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&q1);
634 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
635 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
636 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pXfer->pOut, "cfile %s ", zUuid);
@@ -690,11 +702,11 @@
690 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
691 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
692 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_step(&q1)==SQLITE_ROW ){
693 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 mtime = db_column_int64(&q1, 0);
694 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zHash = db_column_text(&q1, 1);
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pXfer->clientVersion<20000 && db_column_bytes(&q1,1)>HNAME_LEN_SHA1 ){
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pXfer->remoteVersion<20000 && db_column_bytes(&q1,1)>HNAME_LEN_SHA1 ){
696 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer_cannot_send_sha3_error(pXfer);
697 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&q1);
698 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
699 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
700 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(pXfer->pOut)>=pXfer->mxSend ){
@@ -1293,24 +1305,36 @@
1293 1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
1294 1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1295 1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* igot HASH ?ISPRIVATE?
1296 1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1297 1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Client announces that it has a particular file. If the ISPRIVATE
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** argument exists and is non-zero, then the file is a private file.
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argument exists and is "1", then the file is a private file.
1299 1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1300 1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( xfer.nToken>=2
1301 1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& blob_eq(&xfer.aToken[0], "igot")
1302 1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& blob_is_hname(&xfer.aToken[1])
1303 1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1304 1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isPush ){
1305 1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rid = 0;
1306 1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( xfer.nToken==2 || blob_eq(&xfer.aToken[2],"1")==0 ){
1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Client says the artifact is public */
1307 1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = rid_from_uuid(&xfer.aToken[1], 1, 0);
1308 1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.perm.Private ){
1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Client says the artifact is private and the client has
1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** permission to push private content. Create a new phantom
1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** artifact that is marked private. */
1309 1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = rid_from_uuid(&xfer.aToken[1], 1, 1);
1310 1326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server_private_xfer_not_authorized();
1327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Client says the artifact is private and the client is unable
1328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or unwilling to send us the artifact. If we already hold the
1329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** artifact here on the server as a phantom, make sure that
1330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** phantom is marked as private so that we don't keep asking about
1331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it in subsequent sync requests. */
1332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rid = rid_from_uuid(&xfer.aToken[1], 0, 1);
1333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rid>0 ){
1334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("INSERT OR IGNORE INTO private(rid) VALUES(%d)",rid);
1335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1312 1336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1313 1337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rid ) remote_has(rid);
1314 1338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1315 1339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
1316 1340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -1542,17 +1566,24 @@
1542 1566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1543 1567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_eq(&xfer.aToken[1], "send-catalog") ){
1544 1568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.resync = 0x7fffffff;
1545 1569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1546 1570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* pragma client-version VERSION
1571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pragma client-version VERSION ?DATE? ?TIME?
1548 1572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1549 1573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The client announces to the server what version of Fossil it
1550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is running.
1574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is running. The DATE and TIME are a pure numeric ISO8601 time
1575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the specific check-in of the client.
1551 1576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1552 1577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( xfer.nToken>=3 && blob_eq(&xfer.aToken[1], "client-version") ){
1553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xfer.clientVersion = atoi(blob_str(&xfer.aToken[2]));
1578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteVersion = atoi(blob_str(&xfer.aToken[2]));
1579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( xfer.nToken>=5 ){
1580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteDate = atoi(blob_str(&xfer.aToken[3]));
1581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteTime = atoi(blob_str(&xfer.aToken[4]));
1582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ pragma server-version %d(RELEASE_VERSION_NUMBER) \
1583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %d(MANIFEST_NUMERIC_DATE) %d(MANIFEST_NUMERIC_TIME)
1584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1554 1585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1555 1586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1556 1587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* pragma uv-hash HASH
1557 1588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1558 1589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The client wants to make sure that unversioned files are all synced.
@@ -1834,11 +1865,11 @@
1834 1865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&xfer, 0, sizeof(xfer));
1835 1866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.pIn = &recv;
1836 1867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.pOut = &send;
1837 1868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.mxSend = db_get_int("max-upload", 250000);
1838 1869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.maxTime = -1;
1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xfer.clientVersion = RELEASE_VERSION_NUMBER;
1870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteVersion = RELEASE_VERSION_NUMBER;
1840 1871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( syncFlags & SYNC_PRIVATE ){
1841 1872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.perm.Private = 1;
1842 1873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.syncPrivate = 1;
1843 1874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1844 1875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -1885,11 +1916,13 @@
1885 1916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1886 1917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1887 1918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The request from the client always begin with a clone, pull,
1888 1919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or push message.
1889 1920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&send, "pragma client-version %d\n", RELEASE_VERSION_NUMBER);
1921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&send, "pragma client-version %d %d %d\n",
1922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ RELEASE_VERSION_NUMBER, MANIFEST_NUMERIC_DATE,
1923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MANIFEST_NUMERIC_TIME);
1891 1924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( syncFlags & SYNC_CLONE ){
1892 1925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&send, "clone 3 %d\n", cloneSeqno);
1893 1926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
syncFlags &= ~(SYNC_PUSH|SYNC_PULL);
1894 1927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nCardSent++;
1895 1928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* TBD: Request all transferable configuration values */
@@ -2082,11 +2115,13 @@
2082 2115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.nGimmeSent = 0;
2083 2116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfer.nIGotSent = 0;
2084 2117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2085 2118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lastPctDone = -1;
2086 2119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&send);
2087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&send, "pragma client-version %d\n", RELEASE_VERSION_NUMBER);
2120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&send, "pragma client-version %d %d %d\n",
2121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ RELEASE_VERSION_NUMBER, MANIFEST_NUMERIC_DATE,
2122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MANIFEST_NUMERIC_TIME);
2088 2123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rArrivalTime = db_double(0.0, "SELECT julianday('now')");
2089 2124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2090 2125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Send the send-private pragma if we are trying to sync private data */
2091 2126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( syncFlags & SYNC_PRIVATE ){
2092 2127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&send, "pragma send-private\n", -1);
@@ -2210,10 +2245,11 @@
2210 2245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = rid_from_uuid(&xfer.aToken[1], 0, 0);
2211 2246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rid>0 ){
2212 2247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !isPriv ) content_make_public(rid);
2213 2248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( isPriv && !g.perm.Private ){
2214 2249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* ignore private files */
2250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("INSERT OR IGNORE INTO private VALUES(%d)", rid);
2215 2251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( (syncFlags & (SYNC_PULL|SYNC_CLONE))!=0 ){
2216 2252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = content_new(blob_str(&xfer.aToken[1]), isPriv);
2217 2253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rid ) newPhantom = 1;
2218 2254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2219 2255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
remote_has(rid);
@@ -2393,11 +2429,27 @@
2393 2429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The server can send pragmas to try to convey meta-information to
2394 2430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the client. These are informational only. Unknown pragmas are
2395 2431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** silently ignored.
2396 2432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2397 2433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_eq(&xfer.aToken[0], "pragma") && xfer.nToken>=2 ){
2398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the server is unwill to accept new unversioned content (because
2434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pragma server-version VERSION ?DATE? ?TIME?
2435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The servger announces to the server what version of Fossil it
2437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is running. The DATE and TIME are a pure numeric ISO8601 time
2438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the specific check-in of the client.
2439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( xfer.nToken>=3 && blob_eq(&xfer.aToken[1], "client-version") ){
2441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteVersion = atoi(blob_str(&xfer.aToken[2]));
2442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( xfer.nToken>=5 ){
2443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteDate = atoi(blob_str(&xfer.aToken[3]));
2444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfer.remoteTime = atoi(blob_str(&xfer.aToken[4]));
2445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pragma uv-pull-only
2449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the server is unwill to accept new unversioned content (because
2399 2451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this client lacks the necessary permissions) then it sends a
2400 2452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "uv-pull-only" pragma so that the client will know not to waste
2401 2453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** bandwidth trying to upload unversioned content. If the server
2402 2454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** does accept new unversioned content, it sends "uv-push-ok".
2403 2455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2404 2456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!