Fossil

Hex Artifact Content
Login

Artifact 8b50b5df163adae3fc79281fd1f7a2ecbd3a4381:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65 64 20  tains code used 
0270: 74 6f 20 70 75 73 68 2c 20 70 75 6c 6c 2c 20 61  to push, pull, a
0280: 6e 64 20 73 79 6e 63 20 61 20 72 65 70 6f 73 69  nd sync a reposi
0290: 74 6f 72 79 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  tory.*/.#include
02a0: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
02b0: 6c 75 64 65 20 22 73 79 6e 63 2e 68 22 0a 23 69  lude "sync.h".#i
02c0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
02d0: 3e 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  >../*.** If the 
02e0: 72 65 70 6f 73 69 74 6f 72 79 20 69 73 20 63 6f  repository is co
02f0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 75 74  nfigured for aut
0300: 6f 73 79 6e 63 69 6e 67 2c 20 74 68 65 6e 20 64  osyncing, then d
0310: 6f 20 61 6e 0a 2a 2a 20 61 75 74 6f 73 79 6e 63  o an.** autosync
0320: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
0330: 61 20 70 75 6c 6c 20 69 66 20 74 68 65 20 61 72  a pull if the ar
0340: 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 20 6f  gument is true o
0350: 72 20 61 20 70 75 73 68 0a 2a 2a 20 69 66 20 74  r a push.** if t
0360: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  he argument is f
0370: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alse..**.** Retu
0380: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
0390: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
03a0: 61 75 74 6f 73 79 6e 63 28 69 6e 74 20 66 6c 61  autosync(int fla
03b0: 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gs){.  const cha
03c0: 72 20 2a 7a 41 75 74 6f 73 79 6e 63 3b 0a 20 20  r *zAutosync;.  
03d0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 63 6f  int rc;.  int co
03e0: 6e 66 69 67 53 79 6e 63 20 3d 20 30 3b 20 20 20  nfigSync = 0;   
03f0: 20 20 20 20 2f 2a 20 63 6f 6e 66 69 67 75 72 61      /* configura
0400: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 74 72 61  tion changes tra
0410: 6e 73 66 65 72 72 65 64 20 2a 2f 0a 20 20 69 66  nsferred */.  if
0420: 28 20 67 2e 66 4e 6f 53 79 6e 63 20 29 7b 0a 20  ( g.fNoSync ){. 
0430: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0440: 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 59  .  if( flags==SY
0450: 4e 43 5f 50 55 53 48 20 26 26 20 64 62 5f 67 65  NC_PUSH && db_ge
0460: 74 5f 62 6f 6f 6c 65 61 6e 28 22 64 6f 6e 74 2d  t_boolean("dont-
0470: 70 75 73 68 22 2c 30 29 20 29 7b 0a 20 20 20 20  push",0) ){.    
0480: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0490: 7a 41 75 74 6f 73 79 6e 63 20 3d 20 64 62 5f 67  zAutosync = db_g
04a0: 65 74 28 22 61 75 74 6f 73 79 6e 63 22 2c 20 30  et("autosync", 0
04b0: 29 3b 0a 20 20 69 66 28 20 7a 41 75 74 6f 73 79  );.  if( zAutosy
04c0: 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  nc ){.    if( (f
04d0: 6c 61 67 73 20 26 20 53 59 4e 43 5f 50 55 53 48  lags & SYNC_PUSH
04e0: 29 21 3d 30 20 26 26 20 66 6f 73 73 69 6c 5f 73  )!=0 && fossil_s
04f0: 74 72 6e 63 6d 70 28 7a 41 75 74 6f 73 79 6e 63  trncmp(zAutosync
0500: 2c 22 70 75 6c 6c 22 2c 34 29 3d 3d 30 20 29 7b  ,"pull",4)==0 ){
0510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0520: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 75 74     /* Do not aut
0530: 6f 2d 70 75 73 68 20 77 68 65 6e 20 61 75 74 6f  o-push when auto
0540: 73 79 6e 63 3d 70 75 6c 6c 6f 6e 6c 79 20 2a 2f  sync=pullonly */
0550: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
0560: 73 5f 66 61 6c 73 65 28 7a 41 75 74 6f 73 79 6e  s_false(zAutosyn
0570: 63 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  c) ){.      retu
0580: 72 6e 20 30 3b 20 20 20 2f 2a 20 41 75 74 6f 73  rn 0;   /* Autos
0590: 79 6e 63 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ync is completel
05a0: 79 20 6f 66 66 20 2a 2f 0a 20 20 20 20 7d 0a 20  y off */.    }. 
05b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
05c0: 75 74 6f 73 79 6e 63 20 64 65 66 61 75 6c 74 73  utosync defaults
05d0: 20 6f 6e 2e 20 20 54 6f 20 6d 61 6b 65 20 69 74   on.  To make it
05e0: 20 64 65 66 61 75 6c 74 20 6f 66 66 2c 20 22 72   default off, "r
05f0: 65 74 75 72 6e 22 20 68 65 72 65 2e 20 2a 2f 0a  eturn" here. */.
0600: 20 20 7d 0a 20 20 75 72 6c 5f 70 61 72 73 65 28    }.  url_parse(
0610: 30 2c 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52 29  0, URL_REMEMBER)
0620: 3b 0a 20 20 69 66 28 20 67 2e 75 72 6c 2e 70 72  ;.  if( g.url.pr
0630: 6f 74 6f 63 6f 6c 3d 3d 30 20 29 20 72 65 74 75  otocol==0 ) retu
0640: 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 2e 75 72  rn 0;.  if( g.ur
0650: 6c 2e 75 73 65 72 21 3d 30 20 26 26 20 67 2e 75  l.user!=0 && g.u
0660: 72 6c 2e 70 61 73 73 77 64 3d 3d 30 20 29 7b 0a  rl.passwd==0 ){.
0670: 20 20 20 20 67 2e 75 72 6c 2e 70 61 73 73 77 64      g.url.passwd
0680: 20 3d 20 75 6e 6f 62 73 63 75 72 65 28 64 62 5f   = unobscure(db_
0690: 67 65 74 28 22 6c 61 73 74 2d 73 79 6e 63 2d 70  get("last-sync-p
06a0: 77 22 2c 20 30 29 29 3b 0a 20 20 20 20 67 2e 75  w", 0));.    g.u
06b0: 72 6c 2e 66 6c 61 67 73 20 7c 3d 20 55 52 4c 5f  rl.flags |= URL_
06c0: 50 52 4f 4d 50 54 5f 50 57 3b 0a 20 20 20 20 75  PROMPT_PW;.    u
06d0: 72 6c 5f 70 72 6f 6d 70 74 5f 66 6f 72 5f 70 61  rl_prompt_for_pa
06e0: 73 73 77 6f 72 64 28 29 3b 0a 20 20 7d 0a 20 20  ssword();.  }.  
06f0: 67 2e 7a 48 74 74 70 41 75 74 68 20 3d 20 67 65  g.zHttpAuth = ge
0700: 74 5f 68 74 74 70 61 75 74 68 28 29 3b 0a 20 20  t_httpauth();.  
0710: 75 72 6c 5f 72 65 6d 65 6d 62 65 72 28 29 3b 0a  url_remember();.
0720: 23 69 66 20 30 20 2f 2a 20 44 69 73 61 62 6c 65  #if 0 /* Disable
0730: 64 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 20 20 69  d for now */.  i
0740: 66 28 20 28 66 6c 61 67 73 20 26 20 41 55 54 4f  f( (flags & AUTO
0750: 53 59 4e 43 5f 50 55 4c 4c 29 21 3d 30 20 26 26  SYNC_PULL)!=0 &&
0760: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28   db_get_boolean(
0770: 22 61 75 74 6f 2d 73 68 75 6e 22 2c 31 29 20 29  "auto-shun",1) )
0780: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 64 6f  {.    /* When do
0790: 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
07a0: 20 70 75 6c 6c 2c 20 61 6c 73 6f 20 61 75 74 6f   pull, also auto
07b0: 6d 61 74 69 63 61 6c 6c 79 20 70 75 6c 6c 20 73  matically pull s
07c0: 68 75 6e 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  huns from.    **
07d0: 20 74 68 65 20 73 65 72 76 65 72 20 69 66 20 70   the server if p
07e0: 75 6c 6c 5f 73 68 75 6e 73 20 69 73 20 65 6e 61  ull_shuns is ena
07f0: 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
0800: 20 2a 2a 20 54 4f 44 4f 3a 20 20 57 68 61 74 20   ** TODO:  What 
0810: 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73  happens if the s
0820: 68 75 6e 20 6c 69 73 74 20 67 65 74 73 20 72 65  hun list gets re
0830: 61 6c 6c 79 20 62 69 67 3f 0a 20 20 20 20 2a 2a  ally big?.    **
0840: 20 4d 61 79 62 65 20 74 68 65 20 73 68 75 6e 6e   Maybe the shunn
0850: 69 6e 67 20 6c 69 73 74 20 73 68 6f 75 6c 64 20  ing list should 
0860: 6f 6e 6c 79 20 62 65 20 70 75 6c 6c 65 64 20 6f  only be pulled o
0870: 6e 20 65 76 65 72 79 20 31 30 74 68 0a 20 20 20  n every 10th.   
0880: 20 2a 2a 20 61 75 74 6f 73 79 6e 63 2c 20 6f 72   ** autosync, or
0890: 20 73 6f 6d 65 74 68 69 6e 67 3f 0a 20 20 20 20   something?.    
08a0: 2a 2f 0a 20 20 20 20 63 6f 6e 66 69 67 53 79 6e  */.    configSyn
08b0: 63 20 3d 20 43 4f 4e 46 49 47 53 45 54 5f 53 48  c = CONFIGSET_SH
08c0: 55 4e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  UN;.  }.#endif. 
08d0: 20 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f 6e   if( find_option
08e0: 28 22 76 65 72 62 6f 73 65 22 2c 22 76 22 2c 30  ("verbose","v",0
08f0: 29 21 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20  )!=0 ) flags |= 
0900: 53 59 4e 43 5f 56 45 52 42 4f 53 45 3b 0a 20 20  SYNC_VERBOSE;.  
0910: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 41 75  fossil_print("Au
0920: 74 6f 73 79 6e 63 3a 20 20 25 73 5c 6e 22 2c 20  tosync:  %s\n", 
0930: 67 2e 75 72 6c 2e 63 61 6e 6f 6e 69 63 61 6c 29  g.url.canonical)
0940: 3b 0a 20 20 75 72 6c 5f 65 6e 61 62 6c 65 5f 70  ;.  url_enable_p
0950: 72 6f 78 79 28 22 76 69 61 20 70 72 6f 78 79 3a  roxy("via proxy:
0960: 20 22 29 3b 0a 20 20 72 63 20 3d 20 63 6c 69 65   ");.  rc = clie
0970: 6e 74 5f 73 79 6e 63 28 66 6c 61 67 73 2c 20 63  nt_sync(flags, c
0980: 6f 6e 66 69 67 53 79 6e 63 2c 20 30 29 3b 0a 20  onfigSync, 0);. 
0990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
09a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
09b0: 65 20 77 69 6c 6c 20 74 72 79 20 61 20 6e 75 6d  e will try a num
09c0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20  ber of times to 
09d0: 70 65 72 66 6f 72 6d 20 61 75 74 6f 73 79 6e 63  perform autosync
09e0: 20 77 69 74 68 20 61 0a 2a 2a 20 30 2e 35 20 73   with a.** 0.5 s
09f0: 65 63 6f 6e 64 20 73 6c 65 65 70 20 62 65 74 77  econd sleep betw
0a00: 65 65 6e 20 61 74 74 65 6d 70 74 73 2e 0a 2a 2a  een attempts..**
0a10: 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  .** Return zero 
0a20: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 6e  on success and n
0a30: 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 20 66 61 69  on-zero on a fai
0a40: 6c 75 72 65 2e 20 20 49 66 20 66 61 69 6c 75 72  lure.  If failur
0a50: 65 20 6f 63 63 75 72 73 0a 2a 2a 20 61 6e 64 20  e occurs.** and 
0a60: 64 6f 50 72 6f 6d 70 74 20 66 6c 61 67 20 69 73  doPrompt flag is
0a70: 20 74 72 75 65 2c 20 61 73 6b 20 74 68 65 20 75   true, ask the u
0a80: 73 65 72 20 69 66 20 74 68 65 79 20 77 61 6e 74  ser if they want
0a90: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2c 20 61 6e   to continue, an
0aa0: 64 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 6e 73  d.** if they ans
0ab0: 77 65 72 20 22 79 65 73 22 20 74 68 65 6e 20 72  wer "yes" then r
0ac0: 65 74 75 72 6e 20 7a 65 72 6f 20 69 6e 20 73 70  eturn zero in sp
0ad0: 69 74 65 20 6f 66 20 74 68 65 20 66 61 69 6c 75  ite of the failu
0ae0: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 61 75 74 6f 73  re..*/.int autos
0af0: 79 6e 63 5f 6c 6f 6f 70 28 69 6e 74 20 66 6c 61  ync_loop(int fla
0b00: 67 73 2c 20 69 6e 74 20 6e 54 72 69 65 73 2c 20  gs, int nTries, 
0b10: 69 6e 74 20 64 6f 50 72 6f 6d 70 74 29 7b 0a 20  int doPrompt){. 
0b20: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   int n = 0;.  in
0b30: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
0b40: 28 66 6c 61 67 73 20 26 20 28 53 59 4e 43 5f 50  (flags & (SYNC_P
0b50: 55 53 48 7c 53 59 4e 43 5f 50 55 4c 4c 29 29 3d  USH|SYNC_PULL))=
0b60: 3d 28 53 59 4e 43 5f 50 55 53 48 7c 53 59 4e 43  =(SYNC_PUSH|SYNC
0b70: 5f 50 55 4c 4c 29 0a 20 20 20 26 26 20 64 62 5f  _PULL).   && db_
0b80: 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 75 76 2d  get_boolean("uv-
0b90: 73 79 6e 63 22 2c 30 29 0a 20 20 29 7b 0a 20 20  sync",0).  ){.  
0ba0: 20 20 66 6c 61 67 73 20 7c 3d 20 53 59 4e 43 5f    flags |= SYNC_
0bb0: 55 4e 56 45 52 53 49 4f 4e 45 44 3b 0a 20 20 7d  UNVERSIONED;.  }
0bc0: 0a 20 20 77 68 69 6c 65 28 20 28 6e 3d 3d 30 20  .  while( (n==0 
0bd0: 7c 7c 20 6e 3c 6e 54 72 69 65 73 29 20 26 26 20  || n<nTries) && 
0be0: 28 72 63 3d 61 75 74 6f 73 79 6e 63 28 66 6c 61  (rc=autosync(fla
0bf0: 67 73 29 29 20 29 7b 0a 20 20 20 20 69 66 28 20  gs)) ){.    if( 
0c00: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
0c10: 2b 2b 6e 3c 6e 54 72 69 65 73 20 29 7b 0a 20 20  ++n<nTries ){.  
0c20: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72        fossil_war
0c30: 6e 69 6e 67 28 22 41 75 74 6f 73 79 6e 63 20 66  ning("Autosync f
0c40: 61 69 6c 65 64 2c 20 6d 61 6b 69 6e 67 20 61 6e  ailed, making an
0c50: 6f 74 68 65 72 20 61 74 74 65 6d 70 74 2e 22 29  other attempt.")
0c60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
0c70: 33 5f 73 6c 65 65 70 28 35 30 30 29 3b 0a 20 20  3_sleep(500);.  
0c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0c90: 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e     fossil_warnin
0ca0: 67 28 22 41 75 74 6f 73 79 6e 63 20 66 61 69 6c  g("Autosync fail
0cb0: 65 64 2e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed.");.      }. 
0cc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
0cd0: 63 20 26 26 20 64 6f 50 72 6f 6d 70 74 20 29 7b  c && doPrompt ){
0ce0: 0a 20 20 20 20 42 6c 6f 62 20 61 6e 73 3b 0a 20  .    Blob ans;. 
0cf0: 20 20 20 63 68 61 72 20 63 52 65 70 6c 79 3b 0a     char cReply;.
0d00: 20 20 20 20 70 72 6f 6d 70 74 5f 75 73 65 72 28      prompt_user(
0d10: 22 63 6f 6e 74 69 6e 75 65 20 69 6e 20 73 70 69  "continue in spi
0d20: 74 65 20 6f 66 20 73 79 6e 63 20 66 61 69 6c 75  te of sync failu
0d30: 72 65 20 28 79 2f 4e 29 3f 20 22 2c 20 26 61 6e  re (y/N)? ", &an
0d40: 73 29 3b 0a 20 20 20 20 63 52 65 70 6c 79 20 3d  s);.    cReply =
0d50: 20 62 6c 6f 62 5f 73 74 72 28 26 61 6e 73 29 5b   blob_str(&ans)[
0d60: 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 52 65 70  0];.    if( cRep
0d70: 6c 79 3d 3d 27 79 27 20 7c 7c 20 63 52 65 70 6c  ly=='y' || cRepl
0d80: 79 3d 3d 27 59 27 20 29 20 72 63 20 3d 20 30 3b  y=='Y' ) rc = 0;
0d90: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
0da0: 26 61 6e 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  &ans);.  }.  ret
0db0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
0dc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
0dd0: 6f 63 65 73 73 65 73 20 74 68 65 20 63 6f 6d 6d  ocesses the comm
0de0: 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
0df0: 74 20 66 6f 72 20 70 75 73 68 2c 20 70 75 6c 6c  t for push, pull
0e00: 2c 0a 2a 2a 20 61 6e 64 20 73 79 6e 63 2e 20 20  ,.** and sync.  
0e10: 49 66 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  If a command-lin
0e20: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 67 69  e argument is gi
0e30: 76 65 6e 2c 20 74 68 61 74 20 69 73 20 74 68 65  ven, that is the
0e40: 20 55 52 4c 0a 2a 2a 20 6f 66 20 61 20 73 65 72   URL.** of a ser
0e50: 76 65 72 20 74 6f 20 73 79 6e 63 20 61 67 61 69  ver to sync agai
0e60: 6e 73 74 2e 20 20 49 66 20 6e 6f 20 61 72 67 75  nst.  If no argu
0e70: 6d 65 6e 74 20 69 73 20 67 69 76 65 6e 2c 20 75  ment is given, u
0e80: 73 65 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  se the.** most r
0e90: 65 63 65 6e 74 6c 79 20 73 79 6e 63 65 64 20 55  ecently synced U
0ea0: 52 4c 2e 20 20 52 65 6d 65 6d 62 65 72 20 74 68  RL.  Remember th
0eb0: 65 20 63 75 72 72 65 6e 74 20 55 52 4c 20 66 6f  e current URL fo
0ec0: 72 20 6e 65 78 74 20 74 69 6d 65 2e 0a 2a 2f 0a  r next time..*/.
0ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63  static void proc
0ee0: 65 73 73 5f 73 79 6e 63 5f 61 72 67 73 28 0a 20  ess_sync_args(. 
0ef0: 20 75 6e 73 69 67 6e 65 64 20 2a 70 43 6f 6e 66   unsigned *pConf
0f00: 69 67 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a  igFlags,      /*
0f10: 20 57 72 69 74 65 20 63 6f 6e 66 69 67 75 72 61   Write configura
0f20: 74 69 6f 6e 20 66 6c 61 67 73 20 68 65 72 65 20  tion flags here 
0f30: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 70  */.  unsigned *p
0f40: 53 79 6e 63 46 6c 61 67 73 2c 20 20 20 20 20 20  SyncFlags,      
0f50: 20 20 2f 2a 20 57 72 69 74 65 20 73 79 6e 63 20    /* Write sync 
0f60: 66 6c 61 67 73 20 68 65 72 65 20 2a 2f 0a 20 20  flags here */.  
0f70: 69 6e 74 20 75 76 4f 6e 6c 79 20 20 20 20 20 20  int uvOnly      
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f90: 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
0fa0: 20 66 6c 61 67 73 20 66 6f 72 20 55 56 20 73 79   flags for UV sy
0fb0: 6e 63 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  nc */.){.  const
0fc0: 20 63 68 61 72 20 2a 7a 55 72 6c 20 3d 20 30 3b   char *zUrl = 0;
0fd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0fe0: 48 74 74 70 41 75 74 68 20 3d 20 30 3b 0a 20 20  HttpAuth = 0;.  
0ff0: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 53  unsigned configS
1000: 79 6e 63 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ync = 0;.  unsig
1010: 6e 65 64 20 75 72 6c 46 6c 61 67 73 20 3d 20 55  ned urlFlags = U
1020: 52 4c 5f 52 45 4d 45 4d 42 45 52 20 7c 20 55 52  RL_REMEMBER | UR
1030: 4c 5f 50 52 4f 4d 50 54 5f 50 57 3b 0a 20 20 69  L_PROMPT_PW;.  i
1040: 6e 74 20 75 72 6c 4f 70 74 69 6f 6e 61 6c 20 3d  nt urlOptional =
1050: 20 30 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f 6f   0;.  if( find_o
1060: 70 74 69 6f 6e 28 22 61 75 74 6f 75 72 6c 22 2c  ption("autourl",
1070: 30 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 75  0,0)!=0 ){.    u
1080: 72 6c 4f 70 74 69 6f 6e 61 6c 20 3d 20 31 3b 0a  rlOptional = 1;.
1090: 20 20 20 20 75 72 6c 46 6c 61 67 73 20 3d 20 30      urlFlags = 0
10a0: 3b 0a 20 20 7d 0a 20 20 7a 48 74 74 70 41 75 74  ;.  }.  zHttpAut
10b0: 68 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  h = find_option(
10c0: 22 68 74 74 70 61 75 74 68 22 2c 22 42 22 2c 31  "httpauth","B",1
10d0: 29 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f 6f 70  );.  if( find_op
10e0: 74 69 6f 6e 28 22 6f 6e 63 65 22 2c 30 2c 30 29  tion("once",0,0)
10f0: 21 3d 30 20 29 20 75 72 6c 46 6c 61 67 73 20 26  !=0 ) urlFlags &
1100: 3d 20 7e 55 52 4c 5f 52 45 4d 45 4d 42 45 52 3b  = ~URL_REMEMBER;
1110: 0a 20 20 69 66 28 20 28 2a 70 53 79 6e 63 46 6c  .  if( (*pSyncFl
1120: 61 67 73 29 20 26 20 53 59 4e 43 5f 46 52 4f 4d  ags) & SYNC_FROM
1130: 50 41 52 45 4e 54 20 29 20 75 72 6c 46 6c 61 67  PARENT ) urlFlag
1140: 73 20 26 3d 20 7e 55 52 4c 5f 52 45 4d 45 4d 42  s &= ~URL_REMEMB
1150: 45 52 3b 0a 20 20 69 66 28 20 21 75 76 4f 6e 6c  ER;.  if( !uvOnl
1160: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e  y ){.    if( fin
1170: 64 5f 6f 70 74 69 6f 6e 28 22 70 72 69 76 61 74  d_option("privat
1180: 65 22 2c 30 2c 30 29 21 3d 30 20 29 7b 0a 20 20  e",0,0)!=0 ){.  
1190: 20 20 20 20 2a 70 53 79 6e 63 46 6c 61 67 73 20      *pSyncFlags 
11a0: 7c 3d 20 53 59 4e 43 5f 50 52 49 56 41 54 45 3b  |= SYNC_PRIVATE;
11b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68  .    }.    /* Th
11c0: 65 20 2d 2d 76 65 72 69 6c 79 20 6f 70 74 69 6f  e --verily optio
11d0: 6e 20 74 6f 20 73 79 6e 63 2c 20 70 75 73 68 2c  n to sync, push,
11e0: 20 61 6e 64 20 70 75 6c 6c 20 66 6f 72 63 65 73   and pull forces
11f0: 20 65 78 74 72 61 20 69 67 6f 74 20 63 61 72 64   extra igot card
1200: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 65  s.    ** to be e
1210: 78 63 68 61 6e 67 65 64 2e 20 20 54 68 69 73 20  xchanged.  This 
1220: 63 61 6e 20 6f 76 65 72 63 6f 6d 65 20 6d 61 6c  can overcome mal
1230: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  functions in the
1240: 20 73 79 6e 63 20 70 72 6f 74 6f 63 6f 6c 2e 0a   sync protocol..
1250: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
1260: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 76 65 72 69  ind_option("veri
1270: 6c 79 22 2c 30 2c 30 29 21 3d 30 20 29 7b 0a 20  ly",0,0)!=0 ){. 
1280: 20 20 20 20 20 2a 70 53 79 6e 63 46 6c 61 67 73       *pSyncFlags
1290: 20 7c 3d 20 53 59 4e 43 5f 52 45 53 59 4e 43 3b   |= SYNC_RESYNC;
12a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12b0: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 70 72   find_option("pr
12c0: 69 76 61 74 65 22 2c 30 2c 30 29 21 3d 30 20 29  ivate",0,0)!=0 )
12d0: 7b 0a 20 20 20 20 2a 70 53 79 6e 63 46 6c 61 67  {.    *pSyncFlag
12e0: 73 20 7c 3d 20 53 59 4e 43 5f 50 52 49 56 41 54  s |= SYNC_PRIVAT
12f0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e  E;.  }.  if( fin
1300: 64 5f 6f 70 74 69 6f 6e 28 22 76 65 72 62 6f 73  d_option("verbos
1310: 65 22 2c 22 76 22 2c 30 29 21 3d 30 20 29 7b 0a  e","v",0)!=0 ){.
1320: 20 20 20 20 2a 70 53 79 6e 63 46 6c 61 67 73 20      *pSyncFlags 
1330: 7c 3d 20 53 59 4e 43 5f 56 45 52 42 4f 53 45 3b  |= SYNC_VERBOSE;
1340: 0a 20 20 7d 0a 20 20 75 72 6c 5f 70 72 6f 78 79  .  }.  url_proxy
1350: 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 20 20 63 6c  _options();.  cl
1360: 6f 6e 65 5f 73 73 68 5f 66 69 6e 64 5f 6f 70 74  one_ssh_find_opt
1370: 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20 21 75  ions();.  if( !u
1380: 76 4f 6e 6c 79 20 29 20 64 62 5f 66 69 6e 64 5f  vOnly ) db_find_
1390: 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74  and_open_reposit
13a0: 6f 72 79 28 30 2c 20 30 29 3b 0a 20 20 64 62 5f  ory(0, 0);.  db_
13b0: 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 30 2c 20 30  open_config(0, 0
13c0: 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d  );.  if( g.argc=
13d0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  =2 ){.    if( db
13e0: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 75  _get_boolean("au
13f0: 74 6f 2d 73 68 75 6e 22 2c 31 29 20 29 20 63 6f  to-shun",1) ) co
1400: 6e 66 69 67 53 79 6e 63 20 3d 20 43 4f 4e 46 49  nfigSync = CONFI
1410: 47 53 45 54 5f 53 48 55 4e 3b 0a 20 20 7d 65 6c  GSET_SHUN;.  }el
1420: 73 65 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33  se if( g.argc==3
1430: 20 29 7b 0a 20 20 20 20 7a 55 72 6c 20 3d 20 67   ){.    zUrl = g
1440: 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 7d 0a 20 20  .argv[2];.  }.  
1450: 69 66 28 20 28 28 2a 70 53 79 6e 63 46 6c 61 67  if( ((*pSyncFlag
1460: 73 29 20 26 20 28 53 59 4e 43 5f 50 55 53 48 7c  s) & (SYNC_PUSH|
1470: 53 59 4e 43 5f 50 55 4c 4c 29 29 3d 3d 28 53 59  SYNC_PULL))==(SY
1480: 4e 43 5f 50 55 53 48 7c 53 59 4e 43 5f 50 55 4c  NC_PUSH|SYNC_PUL
1490: 4c 29 0a 20 20 20 26 26 20 64 62 5f 67 65 74 5f  L).   && db_get_
14a0: 62 6f 6f 6c 65 61 6e 28 22 75 76 2d 73 79 6e 63  boolean("uv-sync
14b0: 22 2c 30 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  ",0).  ){.    *p
14c0: 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 53 59 4e  SyncFlags |= SYN
14d0: 43 5f 55 4e 56 45 52 53 49 4f 4e 45 44 3b 0a 20  C_UNVERSIONED;. 
14e0: 20 7d 0a 20 20 69 66 28 20 75 72 6c 46 6c 61 67   }.  if( urlFlag
14f0: 73 20 26 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52  s & URL_REMEMBER
1500: 20 29 7b 0a 20 20 20 20 63 6c 6f 6e 65 5f 73 73   ){.    clone_ss
1510: 68 5f 64 62 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  h_db_set_options
1520: 28 29 3b 0a 20 20 7d 0a 20 20 75 72 6c 5f 70 61  ();.  }.  url_pa
1530: 72 73 65 28 7a 55 72 6c 2c 20 75 72 6c 46 6c 61  rse(zUrl, urlFla
1540: 67 73 29 3b 0a 20 20 72 65 6d 65 6d 62 65 72 5f  gs);.  remember_
1550: 6f 72 5f 67 65 74 5f 68 74 74 70 5f 61 75 74 68  or_get_http_auth
1560: 28 7a 48 74 74 70 41 75 74 68 2c 20 75 72 6c 46  (zHttpAuth, urlF
1570: 6c 61 67 73 20 26 20 55 52 4c 5f 52 45 4d 45 4d  lags & URL_REMEM
1580: 42 45 52 2c 20 7a 55 72 6c 29 3b 0a 20 20 75 72  BER, zUrl);.  ur
1590: 6c 5f 72 65 6d 65 6d 62 65 72 28 29 3b 0a 20 20  l_remember();.  
15a0: 69 66 28 20 67 2e 75 72 6c 2e 70 72 6f 74 6f 63  if( g.url.protoc
15b0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ol==0 ){.    if(
15c0: 20 75 72 6c 4f 70 74 69 6f 6e 61 6c 20 29 20 66   urlOptional ) f
15d0: 6f 73 73 69 6c 5f 65 78 69 74 28 30 29 3b 0a 20  ossil_exit(0);. 
15e0: 20 20 20 75 73 61 67 65 28 22 55 52 4c 22 29 3b     usage("URL");
15f0: 0a 20 20 7d 0a 20 20 75 73 65 72 5f 73 65 6c 65  .  }.  user_sele
1600: 63 74 28 29 3b 0a 20 20 69 66 28 20 67 2e 61 72  ct();.  if( g.ar
1610: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  gc==2 ){.    if(
1620: 20 28 28 2a 70 53 79 6e 63 46 6c 61 67 73 29 20   ((*pSyncFlags) 
1630: 26 20 28 53 59 4e 43 5f 50 55 53 48 7c 53 59 4e  & (SYNC_PUSH|SYN
1640: 43 5f 50 55 4c 4c 29 29 3d 3d 28 53 59 4e 43 5f  C_PULL))==(SYNC_
1650: 50 55 53 48 7c 53 59 4e 43 5f 50 55 4c 4c 29 20  PUSH|SYNC_PULL) 
1660: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  ){.      fossil_
1670: 70 72 69 6e 74 28 22 53 79 6e 63 20 77 69 74 68  print("Sync with
1680: 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 63 61   %s\n", g.url.ca
1690: 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 20 20 7d 65  nonical);.    }e
16a0: 6c 73 65 20 69 66 28 20 28 2a 70 53 79 6e 63 46  lse if( (*pSyncF
16b0: 6c 61 67 73 29 20 26 20 53 59 4e 43 5f 50 55 53  lags) & SYNC_PUS
16c0: 48 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  H ){.      fossi
16d0: 6c 5f 70 72 69 6e 74 28 22 50 75 73 68 20 74 6f  l_print("Push to
16e0: 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 63 61   %s\n", g.url.ca
16f0: 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 20 20 7d 65  nonical);.    }e
1700: 6c 73 65 20 69 66 28 20 28 2a 70 53 79 6e 63 46  lse if( (*pSyncF
1710: 6c 61 67 73 29 20 26 20 53 59 4e 43 5f 50 55 4c  lags) & SYNC_PUL
1720: 4c 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  L ){.      fossi
1730: 6c 5f 70 72 69 6e 74 28 22 50 75 6c 6c 20 66 72  l_print("Pull fr
1740: 6f 6d 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e  om %s\n", g.url.
1750: 63 61 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 20 20  canonical);.    
1760: 7d 0a 20 20 7d 0a 20 20 75 72 6c 5f 65 6e 61 62  }.  }.  url_enab
1770: 6c 65 5f 70 72 6f 78 79 28 22 76 69 61 20 70 72  le_proxy("via pr
1780: 6f 78 79 3a 20 22 29 3b 0a 20 20 2a 70 43 6f 6e  oxy: ");.  *pCon
1790: 66 69 67 46 6c 61 67 73 20 7c 3d 20 63 6f 6e 66  figFlags |= conf
17a0: 69 67 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  igSync;.}../*.**
17b0: 20 43 4f 4d 4d 41 4e 44 3a 20 70 75 6c 6c 0a 2a   COMMAND: pull.*
17c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73  *.** Usage: %fos
17d0: 73 69 6c 20 70 75 6c 6c 20 3f 55 52 4c 3f 20 3f  sil pull ?URL? ?
17e0: 6f 70 74 69 6f 6e 73 3f 0a 2a 2a 0a 2a 2a 20 50  options?.**.** P
17f0: 75 6c 6c 20 61 6c 6c 20 73 68 61 72 61 62 6c 65  ull all sharable
1800: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 61 20   changes from a 
1810: 72 65 6d 6f 74 65 20 72 65 70 6f 73 69 74 6f 72  remote repositor
1820: 79 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  y into the local
1830: 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 20   repository..** 
1840: 53 68 61 72 61 62 6c 65 20 63 68 61 6e 67 65 73  Sharable changes
1850: 20 69 6e 63 6c 75 64 65 20 70 75 62 6c 69 63 20   include public 
1860: 63 68 65 63 6b 2d 69 6e 73 2c 20 61 6e 64 20 77  check-ins, and w
1870: 69 6b 69 2c 20 74 69 63 6b 65 74 2c 20 61 6e 64  iki, ticket, and
1880: 20 74 65 63 68 2d 6e 6f 74 65 0a 2a 2a 20 65 64   tech-note.** ed
1890: 69 74 73 2e 20 20 41 64 64 20 74 68 65 20 2d 2d  its.  Add the --
18a0: 70 72 69 76 61 74 65 20 6f 70 74 69 6f 6e 20 74  private option t
18b0: 6f 20 70 75 6c 6c 20 70 72 69 76 61 74 65 20 62  o pull private b
18c0: 72 61 6e 63 68 65 73 2e 20 20 55 73 65 20 74 68  ranches.  Use th
18d0: 65 0a 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74  e.** "configurat
18e0: 69 6f 6e 20 70 75 6c 6c 22 20 63 6f 6d 6d 61 6e  ion pull" comman
18f0: 64 20 74 6f 20 70 75 6c 6c 20 77 65 62 73 69 74  d to pull websit
1900: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
1910: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  details..**.** I
1920: 66 20 55 52 4c 20 69 73 20 6e 6f 74 20 73 70 65  f URL is not spe
1930: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 65  cified, then the
1940: 20 55 52 4c 20 66 72 6f 6d 20 74 68 65 20 6d 6f   URL from the mo
1950: 73 74 20 72 65 63 65 6e 74 20 63 6c 6f 6e 65 2c  st recent clone,
1960: 20 70 75 73 68 2c 0a 2a 2a 20 70 75 6c 6c 2c 20   push,.** pull, 
1970: 72 65 6d 6f 74 65 2d 75 72 6c 2c 20 6f 72 20 73  remote-url, or s
1980: 79 6e 63 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  ync command is u
1990: 73 65 64 2e 20 20 53 65 65 20 22 66 6f 73 73 69  sed.  See "fossi
19a0: 6c 20 68 65 6c 70 20 63 6c 6f 6e 65 22 20 66 6f  l help clone" fo
19b0: 72 0a 2a 2a 20 64 65 74 61 69 6c 73 20 6f 6e 20  r.** details on 
19c0: 74 68 65 20 55 52 4c 20 66 6f 72 6d 61 74 73 2e  the URL formats.
19d0: 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a  .**.** Options:.
19e0: 2a 2a 0a 2a 2a 20 20 20 2d 42 7c 2d 2d 68 74 74  **.**   -B|--htt
19f0: 70 61 75 74 68 20 55 53 45 52 3a 50 41 53 53 20  pauth USER:PASS 
1a00: 20 20 20 43 72 65 64 65 6e 74 69 61 6c 73 20 66     Credentials f
1a10: 6f 72 20 74 68 65 20 73 69 6d 70 6c 65 20 48 54  or the simple HT
1a20: 54 50 20 61 75 74 68 20 70 72 6f 74 6f 63 6f 6c  TP auth protocol
1a30: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 69 66 20 72 65 71 75 69 72 65 64 20 62 79    if required by
1a60: 20 74 68 65 20 72 65 6d 6f 74 65 20 77 65 62 73   the remote webs
1a70: 69 74 65 0a 2a 2a 20 20 20 2d 2d 66 72 6f 6d 2d  ite.**   --from-
1a80: 70 61 72 65 6e 74 2d 70 72 6f 6a 65 63 74 20 20  parent-project  
1a90: 20 20 20 20 50 75 6c 6c 20 63 6f 6e 74 65 6e 74      Pull content
1aa0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
1ab0: 20 70 72 6f 6a 65 63 74 0a 2a 2a 20 20 20 2d 2d   project.**   --
1ac0: 69 70 76 34 20 20 20 20 20 20 20 20 20 20 20 20  ipv4            
1ad0: 20 20 20 20 20 20 20 20 20 55 73 65 20 6f 6e 6c           Use onl
1ae0: 79 20 49 50 76 34 2c 20 6e 6f 74 20 49 50 76 36  y IPv4, not IPv6
1af0: 0a 2a 2a 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20  .**   --once    
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 44 6f 20 6e 6f 74 20 72 65 6d 65 6d 62 65 72   Do not remember
1b20: 20 55 52 4c 20 66 6f 72 20 73 75 62 73 65 71 75   URL for subsequ
1b30: 65 6e 74 20 73 79 6e 63 73 0a 2a 2a 20 20 20 2d  ent syncs.**   -
1b40: 2d 70 72 6f 78 79 20 50 52 4f 58 59 20 20 20 20  -proxy PROXY    
1b50: 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1b60: 65 20 73 70 65 63 69 66 69 65 64 20 48 54 54 50  e specified HTTP
1b70: 20 70 72 6f 78 79 0a 2a 2a 20 20 20 2d 2d 70 72   proxy.**   --pr
1b80: 69 76 61 74 65 20 20 20 20 20 20 20 20 20 20 20  ivate           
1b90: 20 20 20 20 20 20 20 50 75 6c 6c 20 70 72 69 76         Pull priv
1ba0: 61 74 65 20 62 72 61 6e 63 68 65 73 20 74 6f 6f  ate branches too
1bb0: 0a 2a 2a 20 20 20 2d 52 7c 2d 2d 72 65 70 6f 73  .**   -R|--repos
1bc0: 69 74 6f 72 79 20 52 45 50 4f 20 20 20 20 20 20  itory REPO      
1bd0: 20 4c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72   Local repositor
1be0: 79 20 74 6f 20 70 75 6c 6c 20 69 6e 74 6f 0a 2a  y to pull into.*
1bf0: 2a 20 20 20 2d 2d 73 73 6c 2d 69 64 65 6e 74 69  *   --ssl-identi
1c00: 74 79 20 46 49 4c 45 20 20 20 20 20 20 20 20 4c  ty FILE        L
1c10: 6f 63 61 6c 20 53 53 4c 20 63 72 65 64 65 6e 74  ocal SSL credent
1c20: 69 61 6c 73 2c 20 69 66 20 72 65 71 75 65 73 74  ials, if request
1c30: 65 64 20 62 79 20 72 65 6d 6f 74 65 0a 2a 2a 20  ed by remote.** 
1c40: 20 20 2d 2d 73 73 68 2d 63 6f 6d 6d 61 6e 64 20    --ssh-command 
1c50: 53 53 48 20 20 20 20 20 20 20 20 20 20 55 73 65  SSH          Use
1c60: 20 53 53 48 20 61 73 20 74 68 65 20 22 73 73 68   SSH as the "ssh
1c70: 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 2d  " command.**   -
1c80: 76 7c 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20  v|--verbose     
1c90: 20 20 20 20 20 20 20 20 20 20 41 64 64 69 74 69            Additi
1ca0: 6f 6e 61 6c 20 28 64 65 62 75 67 67 69 6e 67 29  onal (debugging)
1cb0: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 2d 2d 76   output.**   --v
1cc0: 65 72 69 6c 79 20 20 20 20 20 20 20 20 20 20 20  erily           
1cd0: 20 20 20 20 20 20 20 20 45 78 63 68 61 6e 67 65          Exchange
1ce0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1cf0: 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 6d 6f  on with the remo
1d00: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 74 6f 20 65 6e 73 75 72 65 20 6e 6f 20     to ensure no 
1d30: 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 6c  content is overl
1d40: 6f 6f 6b 65 64 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ooked.**.** See 
1d50: 61 6c 73 6f 3a 20 63 6c 6f 6e 65 2c 20 63 6f 6e  also: clone, con
1d60: 66 69 67 20 70 75 6c 6c 2c 20 70 75 73 68 2c 20  fig pull, push, 
1d70: 72 65 6d 6f 74 65 2d 75 72 6c 2c 20 73 79 6e 63  remote-url, sync
1d80: 0a 2a 2f 0a 76 6f 69 64 20 70 75 6c 6c 5f 63 6d  .*/.void pull_cm
1d90: 64 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69 67  d(void){.  unsig
1da0: 6e 65 64 20 63 6f 6e 66 69 67 46 6c 61 67 73 20  ned configFlags 
1db0: 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
1dc0: 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 59 4e 43  syncFlags = SYNC
1dd0: 5f 50 55 4c 4c 3b 0a 20 20 69 66 28 20 66 69 6e  _PULL;.  if( fin
1de0: 64 5f 6f 70 74 69 6f 6e 28 22 66 72 6f 6d 2d 70  d_option("from-p
1df0: 61 72 65 6e 74 2d 70 72 6f 6a 65 63 74 22 2c 30  arent-project",0
1e00: 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 79  ,0)!=0 ){.    sy
1e10: 6e 63 46 6c 61 67 73 20 7c 3d 20 53 59 4e 43 5f  ncFlags |= SYNC_
1e20: 46 52 4f 4d 50 41 52 45 4e 54 3b 0a 20 20 7d 0a  FROMPARENT;.  }.
1e30: 20 20 70 72 6f 63 65 73 73 5f 73 79 6e 63 5f 61    process_sync_a
1e40: 72 67 73 28 26 63 6f 6e 66 69 67 46 6c 61 67 73  rgs(&configFlags
1e50: 2c 20 26 73 79 6e 63 46 6c 61 67 73 2c 20 30 29  , &syncFlags, 0)
1e60: 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c  ;..  /* We shoul
1e70: 64 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 6f  d be done with o
1e80: 70 74 69 6f 6e 73 2e 2e 20 2a 2f 0a 20 20 76 65  ptions.. */.  ve
1e90: 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73  rify_all_options
1ea0: 28 29 3b 0a 0a 20 20 63 6c 69 65 6e 74 5f 73 79  ();..  client_sy
1eb0: 6e 63 28 73 79 6e 63 46 6c 61 67 73 2c 20 63 6f  nc(syncFlags, co
1ec0: 6e 66 69 67 46 6c 61 67 73 2c 20 30 29 3b 0a 7d  nfigFlags, 0);.}
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a  ../*.** COMMAND:
1ee0: 20 70 75 73 68 0a 2a 2a 0a 2a 2a 20 55 73 61 67   push.**.** Usag
1ef0: 65 3a 20 25 66 6f 73 73 69 6c 20 70 75 73 68 20  e: %fossil push 
1f00: 3f 55 52 4c 3f 20 3f 6f 70 74 69 6f 6e 73 3f 0a  ?URL? ?options?.
1f10: 2a 2a 0a 2a 2a 20 50 75 73 68 20 61 6c 6c 20 73  **.** Push all s
1f20: 68 61 72 61 62 6c 65 20 63 68 61 6e 67 65 73 20  harable changes 
1f30: 66 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c 20 72  from the local r
1f40: 65 70 6f 73 69 74 6f 72 79 20 74 6f 20 61 20 72  epository to a r
1f50: 65 6d 6f 74 65 20 72 65 70 6f 73 69 74 6f 72 79  emote repository
1f60: 2e 0a 2a 2a 20 53 68 61 72 61 62 6c 65 20 63 68  ..** Sharable ch
1f70: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 20 70 75  anges include pu
1f80: 62 6c 69 63 20 63 68 65 63 6b 2d 69 6e 73 2c 20  blic check-ins, 
1f90: 61 6e 64 20 77 69 6b 69 2c 20 74 69 63 6b 65 74  and wiki, ticket
1fa0: 2c 20 61 6e 64 20 74 65 63 68 2d 6e 6f 74 65 0a  , and tech-note.
1fb0: 2a 2a 20 65 64 69 74 73 2e 20 20 55 73 65 20 2d  ** edits.  Use -
1fc0: 2d 70 72 69 76 61 74 65 20 74 6f 20 61 6c 73 6f  -private to also
1fd0: 20 70 75 73 68 20 70 72 69 76 61 74 65 20 62 72   push private br
1fe0: 61 6e 63 68 65 73 2e 20 20 55 73 65 20 74 68 65  anches.  Use the
1ff0: 0a 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69  .** "configurati
2000: 6f 6e 20 70 75 73 68 22 20 63 6f 6d 6d 61 6e 64  on push" command
2010: 20 74 6f 20 70 75 73 68 20 77 65 62 73 69 74 65   to push website
2020: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64   configuration d
2030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  etails..**.** If
2040: 20 55 52 4c 20 69 73 20 6e 6f 74 20 73 70 65 63   URL is not spec
2050: 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ified, then the 
2060: 55 52 4c 20 66 72 6f 6d 20 74 68 65 20 6d 6f 73  URL from the mos
2070: 74 20 72 65 63 65 6e 74 20 63 6c 6f 6e 65 2c 20  t recent clone, 
2080: 70 75 73 68 2c 0a 2a 2a 20 70 75 6c 6c 2c 20 72  push,.** pull, r
2090: 65 6d 6f 74 65 2d 75 72 6c 2c 20 6f 72 20 73 79  emote-url, or sy
20a0: 6e 63 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  nc command is us
20b0: 65 64 2e 20 20 53 65 65 20 22 66 6f 73 73 69 6c  ed.  See "fossil
20c0: 20 68 65 6c 70 20 63 6c 6f 6e 65 22 20 66 6f 72   help clone" for
20d0: 0a 2a 2a 20 64 65 74 61 69 6c 73 20 6f 6e 20 74  .** details on t
20e0: 68 65 20 55 52 4c 20 66 6f 72 6d 61 74 73 2e 0a  he URL formats..
20f0: 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a  **.** Options:.*
2100: 2a 0a 2a 2a 20 20 20 2d 42 7c 2d 2d 68 74 74 70  *.**   -B|--http
2110: 61 75 74 68 20 55 53 45 52 3a 50 41 53 53 20 20  auth USER:PASS  
2120: 20 20 43 72 65 64 65 6e 74 69 61 6c 73 20 66 6f    Credentials fo
2130: 72 20 74 68 65 20 73 69 6d 70 6c 65 20 48 54 54  r the simple HTT
2140: 50 20 61 75 74 68 20 70 72 6f 74 6f 63 6f 6c 2c  P auth protocol,
2150: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 69 66 20 72 65 71 75 69 72 65 64 20 62 79 20   if required by 
2180: 74 68 65 20 72 65 6d 6f 74 65 20 77 65 62 73 69  the remote websi
2190: 74 65 0a 2a 2a 20 20 20 2d 2d 69 70 76 34 20 20  te.**   --ipv4  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 55 73 65 20 6f 6e 6c 79 20 49 50 76 34     Use only IPv4
21c0: 2c 20 6e 6f 74 20 49 50 76 36 0a 2a 2a 20 20 20  , not IPv6.**   
21d0: 2d 2d 6f 6e 63 65 20 20 20 20 20 20 20 20 20 20  --once          
21e0: 20 20 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f             Do no
21f0: 74 20 72 65 6d 65 6d 62 65 72 20 55 52 4c 20 66  t remember URL f
2200: 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  or subsequent sy
2210: 6e 63 73 0a 2a 2a 20 20 20 2d 2d 70 72 6f 78 79  ncs.**   --proxy
2220: 20 50 52 4f 58 59 20 20 20 20 20 20 20 20 20 20   PROXY          
2230: 20 20 20 20 55 73 65 20 74 68 65 20 73 70 65 63      Use the spec
2240: 69 66 69 65 64 20 48 54 54 50 20 70 72 6f 78 79  ified HTTP proxy
2250: 0a 2a 2a 20 20 20 2d 2d 70 72 69 76 61 74 65 20  .**   --private 
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 50 75 73 68 20 70 72 69 76 61 74 65 20 62 72   Push private br
2280: 61 6e 63 68 65 73 20 74 6f 6f 0a 2a 2a 20 20 20  anches too.**   
2290: 2d 52 7c 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20  -R|--repository 
22a0: 52 45 50 4f 20 20 20 20 20 20 20 4c 6f 63 61 6c  REPO       Local
22b0: 20 72 65 70 6f 73 69 74 6f 72 79 20 74 6f 20 70   repository to p
22c0: 75 73 68 20 66 72 6f 6d 0a 2a 2a 20 20 20 2d 2d  ush from.**   --
22d0: 73 73 6c 2d 69 64 65 6e 74 69 74 79 20 46 49 4c  ssl-identity FIL
22e0: 45 20 20 20 20 20 20 20 20 4c 6f 63 61 6c 20 53  E        Local S
22f0: 53 4c 20 63 72 65 64 65 6e 74 69 61 6c 73 2c 20  SL credentials, 
2300: 69 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  if requested by 
2310: 72 65 6d 6f 74 65 0a 2a 2a 20 20 20 2d 2d 73 73  remote.**   --ss
2320: 68 2d 63 6f 6d 6d 61 6e 64 20 53 53 48 20 20 20  h-command SSH   
2330: 20 20 20 20 20 20 20 55 73 65 20 53 53 48 20 61         Use SSH a
2340: 73 20 74 68 65 20 22 73 73 68 22 20 63 6f 6d 6d  s the "ssh" comm
2350: 61 6e 64 0a 2a 2a 20 20 20 2d 76 7c 2d 2d 76 65  and.**   -v|--ve
2360: 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
2370: 20 20 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 28      Additional (
2380: 64 65 62 75 67 67 69 6e 67 29 20 6f 75 74 70 75  debugging) outpu
2390: 74 0a 2a 2a 20 20 20 2d 2d 76 65 72 69 6c 79 20  t.**   --verily 
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 45 78 63 68 61 6e 67 65 20 65 78 74 72 61    Exchange extra
23c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
23d0: 68 20 74 68 65 20 72 65 6d 6f 74 65 0a 2a 2a 20  h the remote.** 
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2400: 65 6e 73 75 72 65 20 6e 6f 20 63 6f 6e 74 65 6e  ensure no conten
2410: 74 20 69 73 20 6f 76 65 72 6c 6f 6f 6b 65 64 0a  t is overlooked.
2420: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2430: 63 6c 6f 6e 65 2c 20 63 6f 6e 66 69 67 20 70 75  clone, config pu
2440: 73 68 2c 20 70 75 6c 6c 2c 20 72 65 6d 6f 74 65  sh, pull, remote
2450: 2d 75 72 6c 2c 20 73 79 6e 63 0a 2a 2f 0a 76 6f  -url, sync.*/.vo
2460: 69 64 20 70 75 73 68 5f 63 6d 64 28 76 6f 69 64  id push_cmd(void
2470: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 6f  ){.  unsigned co
2480: 6e 66 69 67 46 6c 61 67 73 20 3d 20 30 3b 0a 20  nfigFlags = 0;. 
2490: 20 75 6e 73 69 67 6e 65 64 20 73 79 6e 63 46 6c   unsigned syncFl
24a0: 61 67 73 20 3d 20 53 59 4e 43 5f 50 55 53 48 3b  ags = SYNC_PUSH;
24b0: 0a 20 20 70 72 6f 63 65 73 73 5f 73 79 6e 63 5f  .  process_sync_
24c0: 61 72 67 73 28 26 63 6f 6e 66 69 67 46 6c 61 67  args(&configFlag
24d0: 73 2c 20 26 73 79 6e 63 46 6c 61 67 73 2c 20 30  s, &syncFlags, 0
24e0: 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
24f0: 6c 64 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20  ld be done with 
2500: 6f 70 74 69 6f 6e 73 2e 2e 20 2a 2f 0a 20 20 76  options.. */.  v
2510: 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e  erify_all_option
2520: 73 28 29 3b 0a 0a 20 20 69 66 28 20 64 62 5f 67  s();..  if( db_g
2530: 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 64 6f 6e 74  et_boolean("dont
2540: 2d 70 75 73 68 22 2c 30 29 20 29 7b 0a 20 20 20  -push",0) ){.   
2550: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 70   fossil_fatal("p
2560: 75 73 68 69 6e 67 20 69 73 20 70 72 6f 68 69 62  ushing is prohib
2570: 69 74 65 64 3a 20 74 68 65 20 27 64 6f 6e 74 2d  ited: the 'dont-
2580: 70 75 73 68 27 20 6f 70 74 69 6f 6e 20 69 73 20  push' option is 
2590: 73 65 74 22 29 3b 0a 20 20 7d 0a 20 20 63 6c 69  set");.  }.  cli
25a0: 65 6e 74 5f 73 79 6e 63 28 73 79 6e 63 46 6c 61  ent_sync(syncFla
25b0: 67 73 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  gs, 0, 0);.}.../
25c0: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 79  *.** COMMAND: sy
25d0: 6e 63 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  nc.**.** Usage: 
25e0: 25 66 6f 73 73 69 6c 20 73 79 6e 63 20 3f 55 52  %fossil sync ?UR
25f0: 4c 3f 20 3f 6f 70 74 69 6f 6e 73 3f 0a 2a 2a 0a  L? ?options?.**.
2600: 2a 2a 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20 61  ** Synchronize a
2610: 6c 6c 20 73 68 61 72 61 62 6c 65 20 63 68 61 6e  ll sharable chan
2620: 67 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ges between the 
2630: 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79  local repository
2640: 20 61 6e 64 20 61 0a 2a 2a 20 72 65 6d 6f 74 65   and a.** remote
2650: 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 53 68   repository.  Sh
2660: 61 72 61 62 6c 65 20 63 68 61 6e 67 65 73 20 69  arable changes i
2670: 6e 63 6c 75 64 65 20 70 75 62 6c 69 63 20 63 68  nclude public ch
2680: 65 63 6b 2d 69 6e 73 20 61 6e 64 0a 2a 2a 20 65  eck-ins and.** e
2690: 64 69 74 73 20 74 6f 20 77 69 6b 69 20 70 61 67  dits to wiki pag
26a0: 65 73 2c 20 74 69 63 6b 65 74 73 2c 20 61 6e 64  es, tickets, and
26b0: 20 74 65 63 68 6e 69 63 61 6c 20 6e 6f 74 65 73   technical notes
26c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 55 52 4c 20 69  ..**.** If URL i
26d0: 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 2c  s not specified,
26e0: 20 74 68 65 6e 20 74 68 65 20 55 52 4c 20 66 72   then the URL fr
26f0: 6f 6d 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  om the most rece
2700: 6e 74 20 63 6c 6f 6e 65 2c 20 70 75 73 68 2c 0a  nt clone, push,.
2710: 2a 2a 20 70 75 6c 6c 2c 20 72 65 6d 6f 74 65 2d  ** pull, remote-
2720: 75 72 6c 2c 20 6f 72 20 73 79 6e 63 20 63 6f 6d  url, or sync com
2730: 6d 61 6e 64 20 69 73 20 75 73 65 64 2e 20 20 53  mand is used.  S
2740: 65 65 20 22 66 6f 73 73 69 6c 20 68 65 6c 70 20  ee "fossil help 
2750: 63 6c 6f 6e 65 22 20 66 6f 72 0a 2a 2a 20 64 65  clone" for.** de
2760: 74 61 69 6c 73 20 6f 6e 20 74 68 65 20 55 52 4c  tails on the URL
2770: 20 66 6f 72 6d 61 74 73 2e 0a 2a 2a 0a 2a 2a 20   formats..**.** 
2780: 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  Options:.**.**  
2790: 20 2d 42 7c 2d 2d 68 74 74 70 61 75 74 68 20 55   -B|--httpauth U
27a0: 53 45 52 3a 50 41 53 53 20 20 20 20 43 72 65 64  SER:PASS    Cred
27b0: 65 6e 74 69 61 6c 73 20 66 6f 72 20 74 68 65 20  entials for the 
27c0: 73 69 6d 70 6c 65 20 48 54 54 50 20 61 75 74 68  simple HTTP auth
27d0: 20 70 72 6f 74 6f 63 6f 6c 2c 0a 2a 2a 20 20 20   protocol,.**   
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 72 65             if re
2800: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 72 65  quired by the re
2810: 6d 6f 74 65 20 77 65 62 73 69 74 65 0a 2a 2a 20  mote website.** 
2820: 20 20 2d 2d 69 70 76 34 20 20 20 20 20 20 20 20    --ipv4        
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
2840: 20 6f 6e 6c 79 20 49 50 76 34 2c 20 6e 6f 74 20   only IPv4, not 
2850: 49 50 76 36 0a 2a 2a 20 20 20 2d 2d 6f 6e 63 65  IPv6.**   --once
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 44 6f 20 6e 6f 74 20 72 65 6d 65       Do not reme
2880: 6d 62 65 72 20 55 52 4c 20 66 6f 72 20 73 75 62  mber URL for sub
2890: 73 65 71 75 65 6e 74 20 73 79 6e 63 73 0a 2a 2a  sequent syncs.**
28a0: 20 20 20 2d 2d 70 72 6f 78 79 20 50 52 4f 58 59     --proxy PROXY
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
28c0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
28d0: 48 54 54 50 20 70 72 6f 78 79 0a 2a 2a 20 20 20  HTTP proxy.**   
28e0: 2d 2d 70 72 69 76 61 74 65 20 20 20 20 20 20 20  --private       
28f0: 20 20 20 20 20 20 20 20 20 20 20 53 79 6e 63 20             Sync 
2900: 70 72 69 76 61 74 65 20 62 72 61 6e 63 68 65 73  private branches
2910: 20 74 6f 6f 0a 2a 2a 20 20 20 2d 52 7c 2d 2d 72   too.**   -R|--r
2920: 65 70 6f 73 69 74 6f 72 79 20 52 45 50 4f 20 20  epository REPO  
2930: 20 20 20 20 20 4c 6f 63 61 6c 20 72 65 70 6f 73       Local repos
2940: 69 74 6f 72 79 20 74 6f 20 73 79 6e 63 20 77 69  itory to sync wi
2950: 74 68 0a 2a 2a 20 20 20 2d 2d 73 73 6c 2d 69 64  th.**   --ssl-id
2960: 65 6e 74 69 74 79 20 46 49 4c 45 20 20 20 20 20  entity FILE     
2970: 20 20 20 4c 6f 63 61 6c 20 53 53 4c 20 63 72 65     Local SSL cre
2980: 64 65 6e 74 69 61 6c 73 2c 20 69 66 20 72 65 71  dentials, if req
2990: 75 65 73 74 65 64 20 62 79 20 72 65 6d 6f 74 65  uested by remote
29a0: 0a 2a 2a 20 20 20 2d 2d 73 73 68 2d 63 6f 6d 6d  .**   --ssh-comm
29b0: 61 6e 64 20 53 53 48 20 20 20 20 20 20 20 20 20  and SSH         
29c0: 20 55 73 65 20 53 53 48 20 61 73 20 74 68 65 20   Use SSH as the 
29d0: 22 73 73 68 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  "ssh" command.**
29e0: 20 20 20 2d 75 7c 2d 2d 75 6e 76 65 72 73 69 6f     -u|--unversio
29f0: 6e 65 64 20 20 20 20 20 20 20 20 20 20 20 41 6c  ned           Al
2a00: 73 6f 20 73 79 6e 63 20 75 6e 76 65 72 73 69 6f  so sync unversio
2a10: 6e 65 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 20  ned content.**  
2a20: 20 2d 76 7c 2d 2d 76 65 72 62 6f 73 65 20 20 20   -v|--verbose   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 69              Addi
2a40: 74 69 6f 6e 61 6c 20 28 64 65 62 75 67 67 69 6e  tional (debuggin
2a50: 67 29 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 2d  g) output.**   -
2a60: 2d 76 65 72 69 6c 79 20 20 20 20 20 20 20 20 20  -verily         
2a70: 20 20 20 20 20 20 20 20 20 20 45 78 63 68 61 6e            Exchan
2a80: 67 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  ge extra informa
2a90: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2aa0: 6d 6f 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  mote.**         
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 6e       to ensure n
2ad0: 6f 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65  o content is ove
2ae0: 72 6c 6f 6f 6b 65 64 0a 2a 2a 0a 2a 2a 20 53 65  rlooked.**.** Se
2af0: 65 20 61 6c 73 6f 3a 20 63 6c 6f 6e 65 2c 20 70  e also: clone, p
2b00: 75 6c 6c 2c 20 70 75 73 68 2c 20 72 65 6d 6f 74  ull, push, remot
2b10: 65 2d 75 72 6c 0a 2a 2f 0a 76 6f 69 64 20 73 79  e-url.*/.void sy
2b20: 6e 63 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20  nc_cmd(void){.  
2b30: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 46  unsigned configF
2b40: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 75 6e 73 69  lags = 0;.  unsi
2b50: 67 6e 65 64 20 73 79 6e 63 46 6c 61 67 73 20 3d  gned syncFlags =
2b60: 20 53 59 4e 43 5f 50 55 53 48 7c 53 59 4e 43 5f   SYNC_PUSH|SYNC_
2b70: 50 55 4c 4c 3b 0a 20 20 69 66 28 20 66 69 6e 64  PULL;.  if( find
2b80: 5f 6f 70 74 69 6f 6e 28 22 75 6e 76 65 72 73 69  _option("unversi
2b90: 6f 6e 65 64 22 2c 22 75 22 2c 30 29 21 3d 30 20  oned","u",0)!=0 
2ba0: 29 7b 0a 20 20 20 20 73 79 6e 63 46 6c 61 67 73  ){.    syncFlags
2bb0: 20 7c 3d 20 53 59 4e 43 5f 55 4e 56 45 52 53 49   |= SYNC_UNVERSI
2bc0: 4f 4e 45 44 3b 0a 20 20 7d 0a 20 20 70 72 6f 63  ONED;.  }.  proc
2bd0: 65 73 73 5f 73 79 6e 63 5f 61 72 67 73 28 26 63  ess_sync_args(&c
2be0: 6f 6e 66 69 67 46 6c 61 67 73 2c 20 26 73 79 6e  onfigFlags, &syn
2bf0: 63 46 6c 61 67 73 2c 20 30 29 3b 0a 0a 20 20 2f  cFlags, 0);..  /
2c00: 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 64  * We should be d
2c10: 6f 6e 65 20 77 69 74 68 20 6f 70 74 69 6f 6e 73  one with options
2c20: 2e 2e 20 2a 2f 0a 20 20 76 65 72 69 66 79 5f 61  .. */.  verify_a
2c30: 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 0a 20  ll_options();.. 
2c40: 20 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f 6c   if( db_get_bool
2c50: 65 61 6e 28 22 64 6f 6e 74 2d 70 75 73 68 22 2c  ean("dont-push",
2c60: 30 29 20 29 20 73 79 6e 63 46 6c 61 67 73 20 26  0) ) syncFlags &
2c70: 3d 20 7e 53 59 4e 43 5f 50 55 53 48 3b 0a 20 20  = ~SYNC_PUSH;.  
2c80: 63 6c 69 65 6e 74 5f 73 79 6e 63 28 73 79 6e 63  client_sync(sync
2c90: 46 6c 61 67 73 2c 20 63 6f 6e 66 69 67 46 6c 61  Flags, configFla
2ca0: 67 73 2c 20 30 29 3b 0a 20 20 69 66 28 20 28 73  gs, 0);.  if( (s
2cb0: 79 6e 63 46 6c 61 67 73 20 26 20 53 59 4e 43 5f  yncFlags & SYNC_
2cc0: 50 55 53 48 29 3d 3d 30 20 29 7b 0a 20 20 20 20  PUSH)==0 ){.    
2cd0: 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22  fossil_warning("
2ce0: 70 75 6c 6c 20 6f 6e 6c 79 3a 20 74 68 65 20 27  pull only: the '
2cf0: 64 6f 6e 74 2d 70 75 73 68 27 20 6f 70 74 69 6f  dont-push' optio
2d00: 6e 20 69 73 20 73 65 74 22 29 3b 0a 20 20 7d 0a  n is set");.  }.
2d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  }../*.** Handle 
2d20: 74 68 65 20 22 66 6f 73 73 69 6c 20 75 6e 76 65  the "fossil unve
2d30: 72 73 69 6f 6e 65 64 20 73 79 6e 63 22 20 61 6e  rsioned sync" an
2d40: 64 20 22 66 6f 73 73 69 6c 20 75 6e 76 65 72 73  d "fossil unvers
2d50: 69 6f 6e 65 64 20 72 65 76 65 72 74 22 0a 2a 2a  ioned revert".**
2d60: 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 76 6f   commands..*/.vo
2d70: 69 64 20 73 79 6e 63 5f 75 6e 76 65 72 73 69 6f  id sync_unversio
2d80: 6e 65 64 28 75 6e 73 69 67 6e 65 64 20 73 79 6e  ned(unsigned syn
2d90: 63 46 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67  cFlags){.  unsig
2da0: 6e 65 64 20 63 6f 6e 66 69 67 46 6c 61 67 73 20  ned configFlags 
2db0: 3d 20 30 3b 0a 20 20 28 76 6f 69 64 29 66 69 6e  = 0;.  (void)fin
2dc0: 64 5f 6f 70 74 69 6f 6e 28 22 75 76 2d 6e 6f 6f  d_option("uv-noo
2dd0: 70 22 2c 30 2c 30 29 3b 0a 20 20 70 72 6f 63 65  p",0,0);.  proce
2de0: 73 73 5f 73 79 6e 63 5f 61 72 67 73 28 26 63 6f  ss_sync_args(&co
2df0: 6e 66 69 67 46 6c 61 67 73 2c 20 26 73 79 6e 63  nfigFlags, &sync
2e00: 46 6c 61 67 73 2c 20 31 29 3b 0a 20 20 76 65 72  Flags, 1);.  ver
2e10: 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28  ify_all_options(
2e20: 29 3b 0a 20 20 63 6c 69 65 6e 74 5f 73 79 6e 63  );.  client_sync
2e30: 28 73 79 6e 63 46 6c 61 67 73 2c 20 30 2c 20 30  (syncFlags, 0, 0
2e40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
2e50: 41 4e 44 3a 20 72 65 6d 6f 74 65 2d 75 72 6c 0a  AND: remote-url.
2e60: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
2e70: 73 73 69 6c 20 72 65 6d 6f 74 65 2d 75 72 6c 20  ssil remote-url 
2e80: 3f 55 52 4c 7c 6f 66 66 3f 0a 2a 2a 0a 2a 2a 20  ?URL|off?.**.** 
2e90: 51 75 65 72 79 20 61 6e 64 2f 6f 72 20 63 68 61  Query and/or cha
2ea0: 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
2eb0: 73 65 72 76 65 72 20 55 52 4c 20 75 73 65 64 20  server URL used 
2ec0: 62 79 20 74 68 65 20 22 70 75 6c 6c 22 2c 20 22  by the "pull", "
2ed0: 70 75 73 68 22 2c 0a 2a 2a 20 61 6e 64 20 22 73  push",.** and "s
2ee0: 79 6e 63 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a  ync" commands..*
2ef0: 2a 0a 2a 2a 20 54 68 65 20 72 65 6d 6f 74 65 2d  *.** The remote-
2f00: 75 72 6c 20 69 73 20 73 65 74 20 61 75 74 6f 6d  url is set autom
2f10: 61 74 69 63 61 6c 6c 79 20 62 79 20 61 20 22 63  atically by a "c
2f20: 6c 6f 6e 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 72  lone" command or
2f30: 20 62 79 20 61 6e 79 0a 2a 2a 20 22 73 79 6e 63   by any.** "sync
2f40: 22 2c 20 22 70 75 73 68 22 2c 20 6f 72 20 22 70  ", "push", or "p
2f50: 75 6c 6c 22 20 63 6f 6d 6d 61 6e 64 20 74 68 61  ull" command tha
2f60: 74 20 73 70 65 63 69 66 69 65 73 20 61 6e 20 65  t specifies an e
2f70: 78 70 6c 69 63 69 74 20 55 52 4c 2e 0a 2a 2a 20  xplicit URL..** 
2f80: 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 6d 6f  The default remo
2f90: 74 65 2d 75 72 6c 20 69 73 20 75 73 65 64 20 62  te-url is used b
2fa0: 79 20 61 75 74 6f 2d 73 79 6e 63 69 6e 67 20 61  y auto-syncing a
2fb0: 6e 64 20 62 79 20 22 73 79 6e 63 22 2c 20 22 70  nd by "sync", "p
2fc0: 75 73 68 22 2c 0a 2a 2a 20 22 70 75 6c 6c 22 20  ush",.** "pull" 
2fd0: 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20 73 65  that omit the se
2fe0: 72 76 65 72 20 55 52 4c 2e 0a 2a 2a 0a 2a 2a 20  rver URL..**.** 
2ff0: 53 65 65 20 22 66 6f 73 73 69 6c 20 68 65 6c 70  See "fossil help
3000: 20 63 6c 6f 6e 65 22 20 66 6f 72 20 66 75 72 74   clone" for furt
3010: 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  her information 
3020: 61 62 6f 75 74 20 55 52 4c 20 66 6f 72 6d 61 74  about URL format
3030: 73 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  s.**.** See also
3040: 3a 20 63 6c 6f 6e 65 2c 20 70 75 73 68 2c 20 70  : clone, push, p
3050: 75 6c 6c 2c 20 73 79 6e 63 0a 2a 2f 0a 76 6f 69  ull, sync.*/.voi
3060: 64 20 72 65 6d 6f 74 65 5f 75 72 6c 5f 63 6d 64  d remote_url_cmd
3070: 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  (void){.  char *
3080: 7a 55 72 6c 3b 0a 20 20 64 62 5f 66 69 6e 64 5f  zUrl;.  db_find_
3090: 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74  and_open_reposit
30a0: 6f 72 79 28 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a  ory(0, 0);..  /*
30b0: 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 64 6f   We should be do
30c0: 6e 65 20 77 69 74 68 20 6f 70 74 69 6f 6e 73 2e  ne with options.
30d0: 2e 20 2a 2f 0a 20 20 76 65 72 69 66 79 5f 61 6c  . */.  verify_al
30e0: 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 0a 20 20  l_options();..  
30f0: 69 66 28 20 67 2e 61 72 67 63 21 3d 32 20 26 26  if( g.argc!=2 &&
3100: 20 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20   g.argc!=3 ){.  
3110: 20 20 75 73 61 67 65 28 22 3f 55 52 4c 7c 6f 66    usage("?URL|of
3120: 66 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f?");.  }.  if( 
3130: 67 2e 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  g.argc==3 ){.   
3140: 20 64 62 5f 75 6e 73 65 74 28 22 6c 61 73 74 2d   db_unset("last-
3150: 73 79 6e 63 2d 75 72 6c 22 2c 20 30 29 3b 0a 20  sync-url", 0);. 
3160: 20 20 20 64 62 5f 75 6e 73 65 74 28 22 6c 61 73     db_unset("las
3170: 74 2d 73 79 6e 63 2d 70 77 22 2c 20 30 29 3b 0a  t-sync-pw", 0);.
3180: 20 20 20 20 64 62 5f 75 6e 73 65 74 28 22 68 74      db_unset("ht
3190: 74 70 2d 61 75 74 68 22 2c 20 30 29 3b 0a 20 20  tp-auth", 0);.  
31a0: 20 20 69 66 28 20 69 73 5f 66 61 6c 73 65 28 67    if( is_false(g
31b0: 2e 61 72 67 76 5b 32 5d 29 20 29 20 72 65 74 75  .argv[2]) ) retu
31c0: 72 6e 3b 0a 20 20 20 20 75 72 6c 5f 70 61 72 73  rn;.    url_pars
31d0: 65 28 67 2e 61 72 67 76 5b 32 5d 2c 20 55 52 4c  e(g.argv[2], URL
31e0: 5f 52 45 4d 45 4d 42 45 52 7c 55 52 4c 5f 50 52  _REMEMBER|URL_PR
31f0: 4f 4d 50 54 5f 50 57 7c 55 52 4c 5f 41 53 4b 5f  OMPT_PW|URL_ASK_
3200: 52 45 4d 45 4d 42 45 52 5f 50 57 29 3b 0a 20 20  REMEMBER_PW);.  
3210: 7d 0a 20 20 75 72 6c 5f 72 65 6d 65 6d 62 65 72  }.  url_remember
3220: 28 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 64 62 5f  ();.  zUrl = db_
3230: 67 65 74 28 22 6c 61 73 74 2d 73 79 6e 63 2d 75  get("last-sync-u
3240: 72 6c 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  rl", 0);.  if( z
3250: 55 72 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  Url==0 ){.    fo
3260: 73 73 69 6c 5f 70 72 69 6e 74 28 22 6f 66 66 5c  ssil_print("off\
3270: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n");.    return;
3280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 72  .  }else{.    ur
3290: 6c 5f 70 61 72 73 65 28 7a 55 72 6c 2c 20 30 29  l_parse(zUrl, 0)
32a0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
32b0: 6e 74 28 22 25 73 5c 6e 22 2c 20 67 2e 75 72 6c  nt("%s\n", g.url
32c0: 2e 63 61 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 7d  .canonical);.  }
32d0: 0a 7d 0a                                         .}.