Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch less-verbose-sync Excluding Merge-Ins
This is equivalent to a diff from 60f71ba20a to 407cd4c534
2012-11-20
| ||
14:28 | Prevent blank user names from being displayed for items awaiting moderation. Also, Show much less output on a sync operation, unless the --verbose flag is given. check-in: 15708574fe user: drh tags: trunk | |
06:04 | Add 'th1-setup' setting for the optional TH1 script to evaluate after creating and initializing the TH1 interpreter. Revise TH1 integration in preparation for generalized hooks. check-in: b058c8a944 user: mistachkin tags: trunk | |
02:05 | Show much less output on a sync operation, unless the --verbose flag is given. Closed-Leaf check-in: 407cd4c534 user: drh tags: less-verbose-sync | |
2012-11-19
| ||
23:58 | Prevent blank user names from being displayed for items awaiting moderation. Closed-Leaf check-in: 89ed7dc591 user: mistachkin tags: modDispUser | |
23:57 | Fix harmless compiler warning in the wiki rendering code. check-in: 60f71ba20a user: mistachkin tags: trunk | |
16:41 | Fix the git-fast-export generator so that it does not make links to files that for some reason or another do not exist in the repository. Also fix some stylistic problems in the export code. check-in: c3bfb0083a user: drh tags: trunk | |
Changes to src/branch.c.
174 174 } 175 175 176 176 177 177 /* Commit */ 178 178 db_end_transaction(0); 179 179 180 180 /* Do an autosync push, if requested */ 181 - if( !isPrivate ) autosync(AUTOSYNC_PUSH); 181 + if( !isPrivate ) autosync(SYNC_PUSH); 182 182 } 183 183 184 184 /* 185 185 ** Prepare a query that will list branches. 186 186 ** 187 187 ** If (which<0) then the query pulls only closed branches. If 188 188 ** (which>0) then the query pulls all (closed and opened)
Changes to src/checkin.c.
1106 1106 g.markPrivate = 1; 1107 1107 } 1108 1108 1109 1109 /* 1110 1110 ** Autosync if autosync is enabled and this is not a private check-in. 1111 1111 */ 1112 1112 if( !g.markPrivate ){ 1113 - if( autosync(AUTOSYNC_PULL) ){ 1113 + if( autosync(SYNC_PULL) ){ 1114 1114 blob_zero(&ans); 1115 1115 prompt_user("continue in spite of sync failure (y/N)? ", &ans); 1116 1116 cReply = blob_str(&ans)[0]; 1117 1117 if( cReply!='y' && cReply!='Y' ){ 1118 1118 fossil_exit(1); 1119 1119 } 1120 1120 } ................................................................................ 1457 1457 if( testRun ){ 1458 1458 db_end_transaction(1); 1459 1459 exit(1); 1460 1460 } 1461 1461 db_end_transaction(0); 1462 1462 1463 1463 if( !g.markPrivate ){ 1464 - autosync(AUTOSYNC_PUSH); 1464 + autosync(SYNC_PUSH); 1465 1465 } 1466 1466 if( count_nonbranch_children(vid)>1 ){ 1467 1467 fossil_print("**** warning: a fork has occurred *****\n"); 1468 1468 } 1469 1469 }
Changes to src/clone.c.
97 97 ** --ssl-identity=filename Use the SSL identity if requested by the server 98 98 ** 99 99 ** See also: init 100 100 */ 101 101 void clone_cmd(void){ 102 102 char *zPassword; 103 103 const char *zDefaultUser; /* Optional name of the default user */ 104 - const char *zPw; /* The user clone password */ 104 + const char *zPw; /* The user clone password */ 105 105 int nErr = 0; 106 - int bPrivate; /* Also clone private branches */ 106 + int bPrivate = 0; /* Also clone private branches */ 107 107 108 - bPrivate = find_option("private",0,0)!=0; 108 + if( find_option("private",0,0)!=0 ) bPrivate = SYNC_PRIVATE; 109 109 url_proxy_options(); 110 110 if( g.argc < 4 ){ 111 111 usage("?OPTIONS? FILE-OR-URL NEW-REPOSITORY"); 112 112 } 113 113 db_open_config(0); 114 114 if( file_size(g.argv[3])>0 ){ 115 115 fossil_panic("file already exists: %s", g.argv[3]); ................................................................................ 160 160 db_multi_exec( 161 161 "REPLACE INTO config(name,value,mtime)" 162 162 " VALUES('server-code', lower(hex(randomblob(20))), now());" 163 163 ); 164 164 url_enable_proxy(0); 165 165 url_get_password_if_needed(); 166 166 g.xlinkClusterOnly = 1; 167 - nErr = client_sync(0,0,1,bPrivate,CONFIGSET_ALL,0); 167 + nErr = client_sync(SYNC_CLONE | bPrivate,CONFIGSET_ALL,0); 168 168 g.xlinkClusterOnly = 0; 169 169 verify_cancel(); 170 170 db_end_transaction(0); 171 171 db_close(1); 172 172 if( nErr ){ 173 173 file_delete(g.argv[3]); 174 174 fossil_fatal("server returned an error - clone aborted");
Changes to src/configure.c.
904 904 url_parse(zServer); 905 905 if( g.urlPasswd==0 && zPw ) g.urlPasswd = mprintf("%s", zPw); 906 906 user_select(); 907 907 url_enable_proxy("via proxy: "); 908 908 if( legacyFlag ) mask |= CONFIGSET_OLDFORMAT; 909 909 if( overwriteFlag ) mask |= CONFIGSET_OVERWRITE; 910 910 if( strncmp(zMethod, "push", n)==0 ){ 911 - client_sync(0,0,0,0,0,mask); 911 + client_sync(0,0,(unsigned)mask); 912 912 }else if( strncmp(zMethod, "pull", n)==0 ){ 913 - client_sync(0,0,0,0,mask,0); 913 + client_sync(0,(unsigned)mask,0); 914 914 }else{ 915 - client_sync(0,0,0,0,mask,mask); 915 + client_sync(0,(unsigned)mask,(unsigned)mask); 916 916 } 917 917 }else 918 918 if( strncmp(zMethod, "reset", n)==0 ){ 919 919 int mask, i; 920 920 char *zBackup; 921 921 if( g.argc!=4 ) usage("reset AREA"); 922 922 mask = configure_name_to_mask(g.argv[3], 1);
Changes to src/json_branch.c.
303 303 } 304 304 305 305 /* Commit */ 306 306 db_end_transaction(0); 307 307 308 308 #if 0 /* Do an autosync push, if requested */ 309 309 /* arugable for JSON mode? */ 310 - if( !g.isHTTP && !isPrivate ) autosync(AUTOSYNC_PUSH); 310 + if( !g.isHTTP && !isPrivate ) autosync(SYNC_PUSH); 311 311 #endif 312 312 return 0; 313 313 } 314 314 315 315 316 316 /* 317 317 ** Impl of /json/branch/create.
Changes to src/sync.c.
17 17 ** 18 18 ** This file contains code used to push, pull, and sync a repository 19 19 */ 20 20 #include "config.h" 21 21 #include "sync.h" 22 22 #include <assert.h> 23 23 24 -#if INTERFACE 25 -/* 26 -** Flags used to determine which direction(s) an autosync goes in. 27 -*/ 28 -#define AUTOSYNC_PUSH 1 29 -#define AUTOSYNC_PULL 2 30 - 31 -#endif /* INTERFACE */ 32 - 33 24 /* 34 25 ** If the repository is configured for autosyncing, then do an 35 26 ** autosync. This will be a pull if the argument is true or a push 36 27 ** if the argument is false. 37 28 ** 38 29 ** Return the number of errors. 39 30 */ ................................................................................ 42 33 const char *zAutosync; 43 34 const char *zPw; 44 35 int rc; 45 36 int configSync = 0; /* configuration changes transferred */ 46 37 if( g.fNoSync ){ 47 38 return 0; 48 39 } 49 - if( flags==AUTOSYNC_PUSH && db_get_boolean("dont-push",0) ){ 40 + if( flags==SYNC_PUSH && db_get_boolean("dont-push",0) ){ 50 41 return 0; 51 42 } 52 43 zAutosync = db_get("autosync", 0); 53 44 if( zAutosync ){ 54 - if( (flags & AUTOSYNC_PUSH)!=0 && memcmp(zAutosync,"pull",4)==0 ){ 45 + if( (flags & SYNC_PUSH)!=0 && memcmp(zAutosync,"pull",4)==0 ){ 55 46 return 0; /* Do not auto-push when autosync=pullonly */ 56 47 } 57 48 if( is_false(zAutosync) ){ 58 49 return 0; /* Autosync is completely off */ 59 50 } 60 51 }else{ 61 52 /* Autosync defaults on. To make it default off, "return" here. */ ................................................................................ 79 70 ** autosync, or something? 80 71 */ 81 72 configSync = CONFIGSET_SHUN; 82 73 } 83 74 #endif 84 75 fossil_print("Autosync: %s\n", g.urlCanonical); 85 76 url_enable_proxy("via proxy: "); 86 - rc = client_sync((flags & AUTOSYNC_PUSH)!=0, 1, 0, 0, configSync, 0); 77 + rc = client_sync(flags, configSync, 0); 87 78 if( rc ) fossil_warning("Autosync failed"); 88 79 return rc; 89 80 } 90 81 91 82 /* 92 83 ** This routine processes the command-line argument for push, pull, 93 84 ** and sync. If a command-line argument is given, that is the URL 94 85 ** of a server to sync against. If no argument is given, use the 95 86 ** most recently synced URL. Remember the current URL for next time. 96 87 */ 97 -static void process_sync_args(int *pConfigSync, int *pPrivate){ 88 +static void process_sync_args(unsigned *pConfigFlags, unsigned *pSyncFlags){ 98 89 const char *zUrl = 0; 99 90 const char *zPw = 0; 100 - int configSync = 0; 91 + unsigned configSync = 0; 101 92 int urlOptional = find_option("autourl",0,0)!=0; 102 93 g.dontKeepUrl = find_option("once",0,0)!=0; 103 - *pPrivate = find_option("private",0,0)!=0; 94 + if( find_option("private",0,0)!=0 ){ 95 + *pSyncFlags |= SYNC_PRIVATE; 96 + } 97 + if( find_option("verbose","v",0)!=0 ){ 98 + *pSyncFlags |= SYNC_VERBOSE; 99 + } 104 100 url_proxy_options(); 105 101 db_find_and_open_repository(0, 0); 106 102 db_open_config(0); 107 103 if( g.argc==2 ){ 108 104 zUrl = db_get("last-sync-url", 0); 109 105 zPw = unobscure(db_get("last-sync-pw", 0)); 110 106 if( db_get_boolean("auto-shun",1) ) configSync = CONFIGSET_SHUN; ................................................................................ 125 121 } 126 122 if( !g.dontKeepUrl ){ 127 123 db_set("last-sync-url", g.urlCanonical, 0); 128 124 if( g.urlPasswd ) db_set("last-sync-pw", obscure(g.urlPasswd), 0); 129 125 } 130 126 user_select(); 131 127 if( g.argc==2 ){ 132 - fossil_print("Server: %s\n", g.urlCanonical); 128 + if( ((*pSyncFlags) & (SYNC_PUSH|SYNC_PULL))==(SYNC_PUSH|SYNC_PULL) ){ 129 + fossil_print("Sync with %s\n", g.urlCanonical); 130 + }else if( (*pSyncFlags) & SYNC_PUSH ){ 131 + fossil_print("Push to %s\n", g.urlCanonical); 132 + }else if( (*pSyncFlags) & SYNC_PULL ){ 133 + fossil_print("Pull from %s\n", g.urlCanonical); 134 + } 133 135 } 134 136 url_enable_proxy("via proxy: "); 135 - *pConfigSync = configSync; 137 + *pConfigFlags |= configSync; 136 138 } 137 139 138 140 /* 139 141 ** COMMAND: pull 140 142 ** 141 143 ** Usage: %fossil pull ?URL? ?options? 142 144 ** ................................................................................ 154 156 ** 155 157 ** Use the --private option to pull private branches from the 156 158 ** remote repository. 157 159 ** 158 160 ** See also: clone, push, sync, remote-url 159 161 */ 160 162 void pull_cmd(void){ 161 - int syncFlags; 162 - int bPrivate; 163 - process_sync_args(&syncFlags, &bPrivate); 164 - client_sync(0,1,0,bPrivate,syncFlags,0); 163 + unsigned configFlags = 0; 164 + unsigned syncFlags = SYNC_PULL; 165 + process_sync_args(&configFlags, &syncFlags); 166 + client_sync(syncFlags, configFlags, 0); 165 167 } 166 168 167 169 /* 168 170 ** COMMAND: push 169 171 ** 170 172 ** Usage: %fossil push ?URL? ?options? 171 173 ** ................................................................................ 183 185 ** 184 186 ** Use the --private option to push private branches to the 185 187 ** remote repository. 186 188 ** 187 189 ** See also: clone, pull, sync, remote-url 188 190 */ 189 191 void push_cmd(void){ 190 - int syncFlags; 191 - int bPrivate; 192 - process_sync_args(&syncFlags, &bPrivate); 192 + unsigned configFlags = 0; 193 + unsigned syncFlags = SYNC_PUSH; 194 + process_sync_args(&configFlags, &syncFlags); 193 195 if( db_get_boolean("dont-push",0) ){ 194 196 fossil_fatal("pushing is prohibited: the 'dont-push' option is set"); 195 197 } 196 - client_sync(1,0,0,bPrivate,0,0); 198 + client_sync(syncFlags, 0, 0); 197 199 } 198 200 199 201 200 202 /* 201 203 ** COMMAND: sync 202 204 ** 203 205 ** Usage: %fossil sync ?URL? ?options? ................................................................................ 221 223 ** 222 224 ** Use the --private option to sync private branches with the 223 225 ** remote repository. 224 226 ** 225 227 ** See also: clone, push, pull, remote-url 226 228 */ 227 229 void sync_cmd(void){ 228 - int syncFlags; 229 - int bPrivate; 230 - int pushFlag = 1; 231 - process_sync_args(&syncFlags, &bPrivate); 232 - if( db_get_boolean("dont-push",0) ) pushFlag = 0; 233 - client_sync(pushFlag,1,0,bPrivate,syncFlags,0); 234 - if( pushFlag==0 ){ 230 + unsigned configFlags = 0; 231 + unsigned syncFlags = SYNC_PUSH|SYNC_PULL; 232 + process_sync_args(&configFlags, &syncFlags); 233 + if( db_get_boolean("dont-push",0) ) syncFlags &= ~SYNC_PUSH; 234 + client_sync(syncFlags, configFlags, 0); 235 + if( (syncFlags & SYNC_PUSH)==0 ){ 235 236 fossil_warning("pull only: the 'dont-push' option is set"); 236 237 } 237 238 } 238 239 239 240 /* 240 241 ** COMMAND: remote-url 241 242 **
Changes to src/update.c.
121 121 debugFlag = find_option("debug",0,0)!=0; 122 122 setmtimeFlag = find_option("setmtime",0,0)!=0; 123 123 db_must_be_within_tree(); 124 124 vid = db_lget_int("checkout", 0); 125 125 if( vid==0 ){ 126 126 fossil_fatal("cannot find current version"); 127 127 } 128 - if( !nochangeFlag && !internalUpdate ) autosync(AUTOSYNC_PULL); 128 + if( !nochangeFlag && !internalUpdate ) autosync(SYNC_PULL); 129 129 130 130 /* Create any empty directories now, as well as after the update, 131 131 ** so changes in settings are reflected now */ 132 132 if( !nochangeFlag ) ensure_empty_dirs_created(); 133 133 134 134 if( internalUpdate ){ 135 135 tid = internalUpdate;
Changes to src/xfer.c.
1264 1264 } 1265 1265 1266 1266 /* 1267 1267 ** Format strings for progress reporting. 1268 1268 */ 1269 1269 static const char zLabelFormat[] = "%-10s %10s %10s %10s %10s\n"; 1270 1270 static const char zValueFormat[] = "\r%-10s %10d %10d %10d %10d\n"; 1271 +static const char zBriefFormat[] = 1272 + "Round-trips: %d Artifacts sent: %d received: %d\r"; 1271 1273 1274 +#if INTERFACE 1275 +/* 1276 +** Flag options for controlling client_sync() 1277 +*/ 1278 +#define SYNC_PUSH 0x0001 1279 +#define SYNC_PULL 0x0002 1280 +#define SYNC_CLONE 0x0004 1281 +#define SYNC_PRIVATE 0x0008 1282 +#define SYNC_VERBOSE 0x0010 1283 +#endif 1272 1284 1273 1285 /* 1274 1286 ** Sync to the host identified in g.urlName and g.urlPath. This 1275 1287 ** routine is called by the client. 1276 1288 ** 1277 1289 ** Records are pushed to the server if pushFlag is true. Records 1278 1290 ** are pulled if pullFlag is true. A full sync occurs if both are 1279 1291 ** true. 1280 1292 */ 1281 1293 int client_sync( 1282 - int pushFlag, /* True to do a push (or a sync) */ 1283 - int pullFlag, /* True to do a pull (or a sync) */ 1284 - int cloneFlag, /* True if this is a clone */ 1285 - int privateFlag, /* True to exchange private branches */ 1286 - int configRcvMask, /* Receive these configuration items */ 1287 - int configSendMask /* Send these configuration items */ 1294 + unsigned syncFlags, /* Mask of SYNC_* flags */ 1295 + unsigned configRcvMask, /* Receive these configuration items */ 1296 + unsigned configSendMask /* Send these configuration items */ 1288 1297 ){ 1289 1298 int go = 1; /* Loop until zero */ 1290 1299 int nCardSent = 0; /* Number of cards sent */ 1291 1300 int nCardRcvd = 0; /* Number of cards received */ 1292 1301 int nCycle = 0; /* Number of round trips to the server */ 1293 1302 int size; /* Size of a config value */ 1294 1303 int origConfigRcvMask; /* Original value of configRcvMask */ ................................................................................ 1302 1311 Xfer xfer; /* Transfer data */ 1303 1312 int pctDone; /* Percentage done with a message */ 1304 1313 int lastPctDone = -1; /* Last displayed pctDone */ 1305 1314 double rArrivalTime; /* Time at which a message arrived */ 1306 1315 const char *zSCode = db_get("server-code", "x"); 1307 1316 const char *zPCode = db_get("project-code", 0); 1308 1317 int nErr = 0; /* Number of errors */ 1318 + int nRoundtrip= 0; /* Number of HTTP requests */ 1319 + int nArtifactSent = 0; /* Total artifacts sent */ 1320 + int nArtifactRcvd = 0; /* Total artifacts received */ 1321 + const char *zOpType = 0;/* Push, Pull, Sync, Clone */ 1309 1322 1310 - if( db_get_boolean("dont-push", 0) ) pushFlag = 0; 1311 - if( pushFlag + pullFlag + cloneFlag == 0 1323 + if( db_get_boolean("dont-push", 0) ) syncFlags &= ~SYNC_PUSH; 1324 + if( (syncFlags & (SYNC_PUSH|SYNC_PULL|SYNC_CLONE))==0 1312 1325 && configRcvMask==0 && configSendMask==0 ) return 0; 1313 1326 1314 1327 transport_stats(0, 0, 1); 1315 1328 socket_global_init(); 1316 1329 memset(&xfer, 0, sizeof(xfer)); 1317 1330 xfer.pIn = &recv; 1318 1331 xfer.pOut = &send; 1319 1332 xfer.mxSend = db_get_int("max-upload", 250000); 1320 - if( privateFlag ){ 1333 + if( syncFlags & SYNC_PRIVATE ){ 1321 1334 g.perm.Private = 1; 1322 1335 xfer.syncPrivate = 1; 1323 1336 } 1324 1337 1325 - assert( pushFlag | pullFlag | cloneFlag | configRcvMask | configSendMask ); 1326 1338 db_begin_transaction(); 1327 1339 db_record_repository_filename(0); 1328 1340 db_multi_exec( 1329 1341 "CREATE TEMP TABLE onremote(rid INTEGER PRIMARY KEY);" 1330 1342 ); 1331 1343 blobarray_zero(xfer.aToken, count(xfer.aToken)); 1332 1344 blob_zero(&send); ................................................................................ 1333 1345 blob_zero(&recv); 1334 1346 blob_zero(&xfer.err); 1335 1347 blob_zero(&xfer.line); 1336 1348 origConfigRcvMask = 0; 1337 1349 1338 1350 1339 1351 /* Send the send-private pragma if we are trying to sync private data */ 1340 - if( privateFlag ) blob_append(&send, "pragma send-private\n", -1); 1352 + if( syncFlags & SYNC_PRIVATE ){ 1353 + blob_append(&send, "pragma send-private\n", -1); 1354 + } 1341 1355 1342 1356 /* 1343 1357 ** Always begin with a clone, pull, or push message 1344 1358 */ 1345 - if( cloneFlag ){ 1359 + if( syncFlags & SYNC_CLONE ){ 1346 1360 blob_appendf(&send, "clone 3 %d\n", cloneSeqno); 1347 - pushFlag = 0; 1348 - pullFlag = 0; 1361 + syncFlags &= ~(SYNC_PUSH|SYNC_PULL); 1349 1362 nCardSent++; 1350 1363 /* TBD: Request all transferable configuration values */ 1351 1364 content_enable_dephantomize(0); 1352 - }else if( pullFlag ){ 1365 + zOpType = "Clone"; 1366 + }else if( syncFlags & SYNC_PULL ){ 1353 1367 blob_appendf(&send, "pull %s %s\n", zSCode, zPCode); 1354 1368 nCardSent++; 1369 + zOpType = "Pull"; 1355 1370 } 1356 - if( pushFlag ){ 1371 + if( syncFlags & SYNC_PUSH ){ 1357 1372 blob_appendf(&send, "push %s %s\n", zSCode, zPCode); 1358 1373 nCardSent++; 1374 + if( (syncFlags & SYNC_PULL)==0 ) zOpType = "Push"; 1359 1375 } 1360 1376 manifest_crosslink_begin(); 1361 1377 transport_global_startup(); 1362 - fossil_print(zLabelFormat, "", "Bytes", "Cards", "Artifacts", "Deltas"); 1378 + if( syncFlags & SYNC_VERBOSE ){ 1379 + fossil_print(zLabelFormat, "", "Bytes", "Cards", "Artifacts", "Deltas"); 1380 + } 1363 1381 1364 1382 while( go ){ 1365 1383 int newPhantom = 0; 1366 1384 char *zRandomness; 1367 1385 1368 1386 /* Send make the most recently received cookie. Let the server 1369 1387 ** figure out if this is a cookie that it cares about. ................................................................................ 1372 1390 if( zCookie ){ 1373 1391 blob_appendf(&send, "cookie %s\n", zCookie); 1374 1392 } 1375 1393 1376 1394 /* Generate gimme cards for phantoms and leaf cards 1377 1395 ** for all leaves. 1378 1396 */ 1379 - if( pullFlag || (cloneFlag && cloneSeqno==1) ){ 1397 + if( (syncFlags & SYNC_PULL)!=0 1398 + || ((syncFlags & SYNC_CLONE)!=0 && cloneSeqno==1) 1399 + ){ 1380 1400 request_phantoms(&xfer, mxPhantomReq); 1381 1401 } 1382 - if( pushFlag ){ 1402 + if( syncFlags & SYNC_PUSH ){ 1383 1403 send_unsent(&xfer); 1384 1404 nCardSent += send_unclustered(&xfer); 1385 - if( privateFlag ) send_private(&xfer); 1405 + if( syncFlags & SYNC_PRIVATE ) send_private(&xfer); 1386 1406 } 1387 1407 1388 1408 /* Send configuration parameter requests. On a clone, delay sending 1389 1409 ** this until the second cycle since the login card might fail on 1390 1410 ** the first cycle. 1391 1411 */ 1392 - if( configRcvMask && (cloneFlag==0 || nCycle>0) ){ 1412 + if( configRcvMask && ((syncFlags & SYNC_CLONE)==0 || nCycle>0) ){ 1393 1413 const char *zName; 1414 + if( zOpType==0 ) zOpType = "Pull"; 1394 1415 zName = configure_first_name(configRcvMask); 1395 1416 while( zName ){ 1396 1417 blob_appendf(&send, "reqconfig %s\n", zName); 1397 1418 zName = configure_next_name(configRcvMask); 1398 1419 nCardSent++; 1399 1420 } 1400 1421 if( (configRcvMask & (CONFIGSET_USER|CONFIGSET_TKT))!=0 ................................................................................ 1405 1426 } 1406 1427 origConfigRcvMask = configRcvMask; 1407 1428 configRcvMask = 0; 1408 1429 } 1409 1430 1410 1431 /* Send configuration parameters being pushed */ 1411 1432 if( configSendMask ){ 1433 + if( zOpType==0 ) zOpType = "Push"; 1412 1434 if( configSendMask & CONFIGSET_OLDFORMAT ){ 1413 1435 const char *zName; 1414 1436 zName = configure_first_name(configSendMask); 1415 1437 while( zName ){ 1416 1438 send_legacy_config_card(&xfer, zName); 1417 1439 zName = configure_next_name(configSendMask); 1418 1440 nCardSent++; ................................................................................ 1428 1450 ** be unique. 1429 1451 */ 1430 1452 zRandomness = db_text(0, "SELECT hex(randomblob(20))"); 1431 1453 blob_appendf(&send, "# %s\n", zRandomness); 1432 1454 free(zRandomness); 1433 1455 1434 1456 /* Exchange messages with the server */ 1435 - fossil_print(zValueFormat, "Sent:", 1436 - blob_size(&send), nCardSent+xfer.nGimmeSent+xfer.nIGotSent, 1437 - xfer.nFileSent, xfer.nDeltaSent); 1457 + if( syncFlags & SYNC_VERBOSE ){ 1458 + fossil_print(zValueFormat, "Sent:", 1459 + blob_size(&send), nCardSent+xfer.nGimmeSent+xfer.nIGotSent, 1460 + xfer.nFileSent, xfer.nDeltaSent); 1461 + }else{ 1462 + nRoundtrip++; 1463 + nArtifactSent += xfer.nFileSent + xfer.nDeltaSent; 1464 + fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd); 1465 + } 1438 1466 nCardSent = 0; 1439 1467 nCardRcvd = 0; 1440 1468 xfer.nFileSent = 0; 1441 1469 xfer.nDeltaSent = 0; 1442 1470 xfer.nGimmeSent = 0; 1443 1471 xfer.nIGotSent = 0; 1444 - if( !g.cgiOutput && !g.fQuiet ){ 1472 + if( syncFlags & SYNC_VERBOSE ){ 1445 1473 fossil_print("waiting for server..."); 1446 1474 } 1447 1475 fflush(stdout); 1448 - if( http_exchange(&send, &recv, cloneFlag==0 || nCycle>0) ){ 1476 + if( http_exchange(&send, &recv, (syncFlags & SYNC_CLONE)==0 || nCycle>0) ){ 1449 1477 nErr++; 1450 1478 break; 1451 1479 } 1452 1480 lastPctDone = -1; 1453 1481 blob_reset(&send); 1454 1482 rArrivalTime = db_double(0.0, "SELECT julianday('now')"); 1455 1483 1456 1484 /* Send the send-private pragma if we are trying to sync private data */ 1457 - if( privateFlag ) blob_append(&send, "pragma send-private\n", -1); 1485 + if( syncFlags & SYNC_PRIVATE ){ 1486 + blob_append(&send, "pragma send-private\n", -1); 1487 + } 1458 1488 1459 1489 /* Begin constructing the next message (which might never be 1460 1490 ** sent) by beginning with the pull or push cards 1461 1491 */ 1462 - if( pullFlag ){ 1492 + if( syncFlags & SYNC_PULL ){ 1463 1493 blob_appendf(&send, "pull %s %s\n", zSCode, zPCode); 1464 1494 nCardSent++; 1465 1495 } 1466 - if( pushFlag ){ 1496 + if( syncFlags & SYNC_PUSH ){ 1467 1497 blob_appendf(&send, "push %s %s\n", zSCode, zPCode); 1468 1498 nCardSent++; 1469 1499 } 1470 1500 go = 0; 1471 1501 1472 1502 /* Process the reply that came back from the server */ 1473 1503 while( blob_line(&recv, &xfer.line) ){ ................................................................................ 1491 1521 } 1492 1522 } 1493 1523 nCardRcvd++; 1494 1524 continue; 1495 1525 } 1496 1526 xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken)); 1497 1527 nCardRcvd++; 1498 - if( !g.cgiOutput && !g.fQuiet && recv.nUsed>0 ){ 1528 + if( (syncFlags & SYNC_VERBOSE)!=0 && recv.nUsed>0 ){ 1499 1529 pctDone = (recv.iCursor*100)/recv.nUsed; 1500 1530 if( pctDone!=lastPctDone ){ 1501 1531 fossil_print("\rprocessed: %d%% ", pctDone); 1502 1532 lastPctDone = pctDone; 1503 1533 fflush(stdout); 1504 1534 } 1505 1535 } ................................................................................ 1506 1536 1507 1537 /* file UUID SIZE \n CONTENT 1508 1538 ** file UUID DELTASRC SIZE \n CONTENT 1509 1539 ** 1510 1540 ** Receive a file transmitted from the server. 1511 1541 */ 1512 1542 if( blob_eq(&xfer.aToken[0],"file") ){ 1513 - xfer_accept_file(&xfer, cloneFlag); 1543 + xfer_accept_file(&xfer, (syncFlags & SYNC_CLONE)!=0); 1544 + nArtifactRcvd++; 1514 1545 }else 1515 1546 1516 1547 /* cfile UUID USIZE CSIZE \n CONTENT 1517 1548 ** cfile UUID DELTASRC USIZE CSIZE \n CONTENT 1518 1549 ** 1519 1550 ** Receive a compressed file transmitted from the server. 1520 1551 */ 1521 1552 if( blob_eq(&xfer.aToken[0],"cfile") ){ 1522 1553 xfer_accept_compressed_file(&xfer); 1554 + nArtifactRcvd++; 1523 1555 }else 1524 1556 1525 1557 /* gimme UUID 1526 1558 ** 1527 1559 ** Server is requesting a file. If the file is a manifest, assume 1528 1560 ** that the server will also want to know all of the content files 1529 1561 ** associated with the manifest and send those too. 1530 1562 */ 1531 1563 if( blob_eq(&xfer.aToken[0], "gimme") 1532 1564 && xfer.nToken==2 1533 1565 && blob_is_uuid(&xfer.aToken[1]) 1534 1566 ){ 1535 - if( pushFlag ){ 1567 + if( syncFlags & SYNC_PUSH ){ 1536 1568 int rid = rid_from_uuid(&xfer.aToken[1], 0, 0); 1537 1569 if( rid ) send_file(&xfer, rid, &xfer.aToken[1], 0); 1538 1570 } 1539 1571 }else 1540 1572 1541 1573 /* igot UUID ?PRIVATEFLAG? 1542 1574 ** ................................................................................ 1557 1589 int rid; 1558 1590 int isPriv = xfer.nToken>=3 && blob_eq(&xfer.aToken[2],"1"); 1559 1591 rid = rid_from_uuid(&xfer.aToken[1], 0, 0); 1560 1592 if( rid>0 ){ 1561 1593 if( !isPriv ) content_make_public(rid); 1562 1594 }else if( isPriv && !g.perm.Private ){ 1563 1595 /* ignore private files */ 1564 - }else if( pullFlag || cloneFlag ){ 1596 + }else if( (syncFlags & (SYNC_PULL|SYNC_CLONE))!=0 ){ 1565 1597 rid = content_new(blob_str(&xfer.aToken[1]), isPriv); 1566 1598 if( rid ) newPhantom = 1; 1567 1599 } 1568 1600 remote_has(rid); 1569 1601 }else 1570 1602 1571 1603 ................................................................................ 1572 1604 /* push SERVERCODE PRODUCTCODE 1573 1605 ** 1574 1606 ** Should only happen in response to a clone. This message tells 1575 1607 ** the client what product to use for the new database. 1576 1608 */ 1577 1609 if( blob_eq(&xfer.aToken[0],"push") 1578 1610 && xfer.nToken==3 1579 - && cloneFlag 1611 + && (syncFlags & SYNC_CLONE)!=0 1580 1612 && blob_is_uuid(&xfer.aToken[1]) 1581 1613 && blob_is_uuid(&xfer.aToken[2]) 1582 1614 ){ 1583 1615 if( blob_eq_str(&xfer.aToken[1], zSCode, -1) ){ 1584 1616 fossil_fatal("server loop"); 1585 1617 } 1586 1618 if( zPCode==0 ){ ................................................................................ 1602 1634 && blob_is_int(&xfer.aToken[2], &size) ){ 1603 1635 const char *zName = blob_str(&xfer.aToken[1]); 1604 1636 Blob content; 1605 1637 blob_zero(&content); 1606 1638 blob_extract(xfer.pIn, size, &content); 1607 1639 g.perm.Admin = g.perm.RdAddr = 1; 1608 1640 configure_receive(zName, &content, origConfigRcvMask); 1609 - nCardSent++; 1641 + nCardRcvd++; 1642 + nArtifactRcvd++; 1610 1643 blob_reset(&content); 1611 1644 blob_seek(xfer.pIn, 1, BLOB_SEEK_CUR); 1612 1645 }else 1613 1646 1614 1647 1615 1648 /* cookie TEXT 1616 1649 ** ................................................................................ 1653 1686 ** 1654 1687 ** If the "login failed" message is seen, clear the sync password prior 1655 1688 ** to the next cycle. 1656 1689 */ 1657 1690 if( blob_eq(&xfer.aToken[0],"message") && xfer.nToken==2 ){ 1658 1691 char *zMsg = blob_terminate(&xfer.aToken[1]); 1659 1692 defossilize(zMsg); 1660 - if( pushFlag && zMsg && strglob("pull only *", zMsg) ){ 1661 - pushFlag = 0; 1693 + if( (syncFlags & SYNC_PUSH) && zMsg && strglob("pull only *", zMsg) ){ 1694 + syncFlags &= ~SYNC_PUSH; 1662 1695 zMsg = 0; 1663 1696 } 1664 1697 fossil_print("\rServer says: %s\n", zMsg); 1665 1698 }else 1666 1699 1667 1700 /* pragma NAME VALUE... 1668 1701 ** ................................................................................ 1681 1714 ** first message exchange because the project-code is unknown 1682 1715 ** and so the login card on the request was invalid. The project-code 1683 1716 ** is returned in the reply before the error card, so second and 1684 1717 ** subsequent messages should be OK. Nevertheless, we need to ignore 1685 1718 ** the error card on the first message of a clone. 1686 1719 */ 1687 1720 if( blob_eq(&xfer.aToken[0],"error") && xfer.nToken==2 ){ 1688 - if( !cloneFlag || nCycle>0 ){ 1721 + if( (syncFlags & SYNC_CLONE)==0 || nCycle>0 ){ 1689 1722 char *zMsg = blob_terminate(&xfer.aToken[1]); 1690 1723 defossilize(zMsg); 1691 1724 if( fossil_strcmp(zMsg, "login failed")==0 ){ 1692 1725 if( nCycle<2 ){ 1693 1726 if( !g.dontKeepUrl ) db_unset("last-sync-pw", 0); 1694 1727 go = 1; 1695 1728 } ................................................................................ 1725 1758 } 1726 1759 if( (configRcvMask & (CONFIGSET_USER|CONFIGSET_TKT))!=0 1727 1760 && (configRcvMask & CONFIGSET_OLDFORMAT)!=0 1728 1761 ){ 1729 1762 configure_finalize_receive(); 1730 1763 } 1731 1764 origConfigRcvMask = 0; 1732 - if( nCardRcvd>0 ){ 1765 + if( nCardRcvd>0 && (syncFlags & SYNC_VERBOSE) ){ 1733 1766 fossil_print(zValueFormat, "Received:", 1734 1767 blob_size(&recv), nCardRcvd, 1735 1768 xfer.nFileRcvd, xfer.nDeltaRcvd + xfer.nDanglingFile); 1769 + }else{ 1770 + fossil_print(zBriefFormat, nRoundtrip, nArtifactSent, nArtifactRcvd); 1736 1771 } 1737 1772 blob_reset(&recv); 1738 1773 nCycle++; 1739 1774 1740 1775 /* If we received one or more files on the previous exchange but 1741 1776 ** there are still phantoms, then go another round. 1742 1777 */ 1743 1778 nFileRecv = xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile; 1744 1779 if( (nFileRecv>0 || newPhantom) && db_exists("SELECT 1 FROM phantom") ){ 1745 1780 go = 1; 1746 1781 mxPhantomReq = nFileRecv*2; 1747 1782 if( mxPhantomReq<200 ) mxPhantomReq = 200; 1748 - }else if( cloneFlag && nFileRecv>0 ){ 1783 + }else if( (syncFlags & SYNC_CLONE)!=0 && nFileRecv>0 ){ 1749 1784 go = 1; 1750 1785 } 1751 1786 nCardRcvd = 0; 1752 1787 xfer.nFileRcvd = 0; 1753 1788 xfer.nDeltaRcvd = 0; 1754 1789 xfer.nDanglingFile = 0; 1755 1790 ................................................................................ 1757 1792 ** another round 1758 1793 */ 1759 1794 if( xfer.nFileSent+xfer.nDeltaSent>0 ){ 1760 1795 go = 1; 1761 1796 } 1762 1797 1763 1798 /* If this is a clone, the go at least two rounds */ 1764 - if( cloneFlag && nCycle==1 ) go = 1; 1799 + if( (syncFlags & SYNC_CLONE)!=0 && nCycle==1 ) go = 1; 1765 1800 1766 1801 /* Stop the cycle if the server sends a "clone_seqno 0" card and 1767 1802 ** we have gone at least two rounds. Always go at least two rounds 1768 1803 ** on a clone in order to be sure to retrieve the configuration 1769 1804 ** information which is only sent on the second round. 1770 1805 */ 1771 1806 if( cloneSeqno<=0 && nCycle>1 ) go = 0; 1772 1807 }; 1773 1808 transport_stats(&nSent, &nRcvd, 1); 1774 - fossil_print("Total network traffic: %lld bytes sent, %lld bytes received\n", 1775 - nSent, nRcvd); 1809 + if( (syncFlags & SYNC_VERBOSE)==0 ) fossil_print("\n"); 1810 + fossil_print( 1811 + "%s finished with %lld bytes sent, %lld bytes received\n", 1812 + zOpType, nSent, nRcvd); 1776 1813 transport_close(); 1777 1814 transport_global_shutdown(); 1778 1815 db_multi_exec("DROP TABLE onremote"); 1779 1816 manifest_crosslink_end(); 1780 1817 content_enable_dephantomize(1); 1781 1818 db_end_transaction(0); 1782 1819 return nErr; 1783 1820 }