@@ -1559,10 +1559,11 @@
1559 1559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& xfer.nToken==4
1560 1560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& blob_is_hname(&xfer.aToken[2])
1561 1561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1562 1562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
1563 1563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iNow = time(0);
1564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const sqlite3_int64 maxAge = 3600*24; /* Locks expire after 24 hours */
1564 1565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int seenFault = 0;
1565 1566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
1566 1567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT json_extract(value,'$.login'),"
1567 1568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" mtime,"
1568 1569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" json_extract(value,'$.clientid'),"
@@ -1571,13 +1572,13 @@
1571 1572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" FROM config WHERE name GLOB 'ci-lock-*'"
1572 1573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1573 1574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
1574 1575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int x = db_column_int(&q,3);
1575 1576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = db_column_text(&q,4);
1576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( db_column_int64(&q,1)<iNow-3600*24 || !is_a_leaf(x) ){
1577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* check-in locks expire after 24 hours, or when the check-in
1578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is no longer a leaf */
1577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_column_int64(&q,1)<iNow-maxAge || !is_a_leaf(x) ){
1578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* check-in locks expire after maxAge seconds, or when the
1579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** check-in is no longer a leaf */
1579 1580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
1580 1581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
1581 1582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1582 1583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strcmp(zName+8, blob_str(&xfer.aToken[2]))==0 ){
1583 1584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zClientId = db_column_text(&q, 2);
@@ -1597,10 +1598,29 @@
1597 1598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_str(&xfer.aToken[2]), g.zLogin,
1598 1599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_str(&xfer.aToken[3])
1599 1600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1600 1601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1601 1602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pragma ci-unlock CLIENT-ID
1605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Remove any locks previously held by CLIENT-ID. Clients send this
1607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pragma with their own ID whenever they know that they no longer
1608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have any commits pending.
1609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_eq(&xfer.aToken[1], "ci-unlock")
1611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && xfer.nToken==3
1612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && blob_is_hname(&xfer.aToken[2])
1613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM config"
1616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name GLOB 'ci-lock-*'"
1617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND json_extract(value,'$.clientid')=%Q",
1618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_str(&xfer.aToken[2])
1619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1602 1622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
1603 1623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1604 1624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Unknown message
1605 1625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1606 1626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
@@ -1762,10 +1782,11 @@
1762 1782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nUvGimmeSent = 0; /* Number of uvgimme cards sent on this cycle */
1763 1783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nUvFileRcvd = 0; /* Number of uvfile cards received on this cycle */
1764 1784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 mtime; /* Modification time on a UV file */
1765 1785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int autopushFailed = 0; /* Autopush following commit failed if true */
1766 1786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCkinLock; /* Name of check-in to lock. NULL for none */
1787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zClientId; /* A unique identifier for this check-out */
1767 1788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1768 1789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_get_boolean("dont-push", 0) ) syncFlags &= ~SYNC_PUSH;
1769 1790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (syncFlags & (SYNC_PUSH|SYNC_PULL|SYNC_CLONE|SYNC_UNVERSIONED))==0
1770 1791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& configRcvMask==0 && configSendMask==0 ) return 0;
1771 1792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( syncFlags & SYNC_FROMPARENT ){
@@ -1797,11 +1818,11 @@
1797 1818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&send);
1798 1819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&recv);
1799 1820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&xfer.err);
1800 1821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&xfer.line);
1801 1822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
origConfigRcvMask = 0;
1802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zClientId = db_lget("client-id", 0);
1803 1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1804 1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Send the send-private pragma if we are trying to sync private data */
1805 1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( syncFlags & SYNC_PRIVATE ){
1806 1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&send, "pragma send-private\n", -1);
1807 1828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1976,18 +1997,18 @@
1976 1997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1977 1998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1978 1999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1979 2000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Lock the current check-out */
1980 2001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zCkinLock ){
1981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zClientId;
1982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zClientId = db_lget("client-id", 0);
1983 2002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zClientId==0 ){
1984 2003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zClientId = db_text(0, "SELECT lower(hex(randomblob(20)))");
1985 2004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_lset("client-id", zClientId);
1986 2005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1987 2006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&send, "pragma ci-lock %s %s\n", zCkinLock, zClientId);
1988 2007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCkinLock = 0;
2008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( zClientId ){
2009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&send, "pragma ci-unlock %s\n", zClientId);
1989 2010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1990 2011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1991 2012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Append randomness to the end of the message. This makes all
1992 2013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** messages unique so that that the login-card nonce will always
1993 2014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be unique.
@@ -2356,13 +2377,21 @@
2356 2377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the lock, and LOCK-TIME is the timestamp (seconds since 1970)
2357 2378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when the lock was taken.
2358 2379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2359 2380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else if( blob_eq(&xfer.aToken[1], "ci-lock-fail") && xfer.nToken==4 ){
2360 2381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zUser = blob_terminate(&xfer.aToken[2]);
2382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 mtime, iNow;
2361 2383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defossilize(zUser);
2362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("\nParent check-in locked by %s\n", zUser);
2363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.ckinLockFail = 1;
2384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iNow = time(NULL);
2385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_is_int64(&xfer.aToken[3], &mtime) && iNow>mtime ){
2386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iNow = time(NULL);
2387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\nParent check-in lock by %s %s ago\n",
2388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUser, human_readable_age((iNow+1-mtime)/86400.0));
2389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\nParent check-in locked by %s\n", zUser);
2391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.ckinLockFail = fossil_strdup(zUser);
2364 2393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2365 2394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
2366 2395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2367 2396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* error MESSAGE
2368 2397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2369 2398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!