Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/crypto/synchronize.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/admin/file.pli"
module "/pliant/language/stream/filesystembase.pli"


module "/pliant/fullpliant/user.pli"
module "/pliant/admin/md5.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/admin/file.pli"
module "/pliant/language/stream/filesystembase.pli"


module "/pliant/fullpliant/user.pli"
module "/pliant/admin/md5.pli"
module "/pliant/language/type/text/str8.pli"
module "/pliant/util/crypto/cipher.pli"
module "/pliant/util/crypto/channel.pli"
module "/pliant/protocol/http/client.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"



    var Array:FileInfo src_files
    if (src_path parse (var Str src_url) any:(var Str src_op
      src_files := file_list src_url src_options extended+re
    else
      src_files := file_list src_path extended+recursive+rel
    var (Dictionary Str FileInfo) src_dict
    for (var Int i) 0 src_files:size-1
      src_dict insert src_files:i:name src_files:i
  
    var Array:FileInfo dest_files
    if (dest_path parse (var Str dest_url) any:(var Str dest
      dest_files := file_list dest_url dest_options extended
    else
      dest_files := file_list dest_path extended+recursive+r
    var (Dictionary Str FileInfo) dest_dict
    for (var Int i) 0 dest_files:size-1
      dest_dict insert dest_files:i:name dest_files:i
  
    if (options option "simulate")
  
      var Int ok_count := 0
      var Int new_count := 0
      var Int changed_count := 0
      var Int deleted_count := 0
      var Int touched_count := 0
      var Intn total := 0
      fixed
        for (var Int i) 0 src_files:size-1
          var Pointer:FileInfo s :> src_files i
          var Pointer:FileInfo d :> dest_dict first s:name
          if not exists:d
            text "+ "+s:name+"[lf]"
            new_count += 1 ; total += s size
          eif d:size=s:size and d:datetime<>s:datetime and (
            var Str temp := file_temporary
            if (file_copy (path_concat src_path s:name) temp
              text "= "+s:name+"[lf]"
              touched_count += 1 ; total += s size
            else
              text "* "+s:name+"[lf]"
              changed_count += 1 ; total += s size
            file_delete temp
          eif d:size<>s:size or d:datetime<>s:datetime
            text "* "+s:name+"[lf]"
            changed_count += 1 ; total += s size
          else
            ok_count += 1
module "/pliant/util/crypto/cipher.pli"
module "/pliant/util/crypto/channel.pli"
module "/pliant/protocol/http/client.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"



    var Array:FileInfo src_files
    if (src_path parse (var Str src_url) any:(var Str src_op
      src_files := file_list src_url src_options extended+re
    else
      src_files := file_list src_path extended+recursive+rel
    var (Dictionary Str FileInfo) src_dict
    for (var Int i) 0 src_files:size-1
      src_dict insert src_files:i:name src_files:i
  
    var Array:FileInfo dest_files
    if (dest_path parse (var Str dest_url) any:(var Str dest
      dest_files := file_list dest_url dest_options extended
    else
      dest_files := file_list dest_path extended+recursive+r
    var (Dictionary Str FileInfo) dest_dict
    for (var Int i) 0 dest_files:size-1
      dest_dict insert dest_files:i:name dest_files:i
  
    if (options option "simulate")
  
      var Int ok_count := 0
      var Int new_count := 0
      var Int changed_count := 0
      var Int deleted_count := 0
      var Int touched_count := 0
      var Intn total := 0
      fixed
        for (var Int i) 0 src_files:size-1
          var Pointer:FileInfo s :> src_files i
          var Pointer:FileInfo d :> dest_dict first s:name
          if not exists:d
            text "+ "+s:name+"[lf]"
            new_count += 1 ; total += s size
          eif d:size=s:size and d:datetime<>s:datetime and (
            var Str temp := file_temporary
            if (file_copy (path_concat src_path s:name) temp
              text "= "+s:name+"[lf]"
              touched_count += 1 ; total += s size
            else
              text "* "+s:name+"[lf]"
              changed_count += 1 ; total += s size
            file_delete temp
          eif d:size<>s:size or d:datetime<>s:datetime
            text "* "+s:name+"[lf]"
            changed_count += 1 ; total += s size
          else
            ok_count += 1
        for (var Int i) 0 dest_files:size-1
          var Pointer:FileInfo d :> dest_files i
          var Pointer:FileInfo s :> src_dict first d:name
          if not exists:s
            text "- "+d:name+"[lf]"
            deleted_count += 1
        if not (options option "nodelete")
          for (var Int i) 0 dest_files:size-1
            var Pointer:FileInfo d :> dest_files i
            var Pointer:FileInfo s :> src_dict first d:name
            if not exists:s
              text "- "+d:name+"[lf]"
              deleted_count += 1
      para
        text string:ok_count+" file(s) up to date." ; eol
        if changed_count>0
          text string:changed_count+" modified file(s)." ; e
        if new_count>0
          text string:new_count+" new file(s)." ; eol
        if touched_count>0
          text string:touched_count+" touched file(s)." ; eo
        if total>=10*2^20
          text (string total\2^20)+" MB to send." ; eol
        eif total>0
          text (string total\2^10)+" KB to send." ; eol
      status := success
  
    else
  
      var Intn total := 0
      for (var Int i) 0 src_files:size-1
        var Pointer:FileInfo s :> src_files i
        var Pointer:FileInfo d :> dest_dict first s:name
        if not exists:d or d:size<>s:size or d:datetime<>s:d
          total += s size
      fixed
        status := success
        var Intn done := 0
        for (var Int i) 0 src_files:size-1
          var Pointer:FileInfo s :> src_files i
          var Pointer:FileInfo d :> dest_dict first s:name
          if not exists:d
            text "+ "+s:name
            var FileInfo d2 := file_query (path_concat dest_
            s name := path_concat src_path s:name
            if (file_copy s d2 extended)=failure
              status := failure ; text " FAILED"
            done += s size ; text "  "+(string 100*done\tota
            flush
          eif d:size<>s:size or d:datetime<>s:datetime
            text "* "+s:name
            s name := path_concat src_path s:name
            d name := path_concat dest_path d:name
            if (file_copy s d extended)=failure
              status := failure ; text " FAILED"
            done += s size ; text "  "+(string 100*done\tota
            flush
      para
        text string:ok_count+" file(s) up to date." ; eol
        if changed_count>0
          text string:changed_count+" modified file(s)." ; e
        if new_count>0
          text string:new_count+" new file(s)." ; eol
        if touched_count>0
          text string:touched_count+" touched file(s)." ; eo
        if total>=10*2^20
          text (string total\2^20)+" MB to send." ; eol
        eif total>0
          text (string total\2^10)+" KB to send." ; eol
      status := success
  
    else
  
      var Intn total := 0
      for (var Int i) 0 src_files:size-1
        var Pointer:FileInfo s :> src_files i
        var Pointer:FileInfo d :> dest_dict first s:name
        if not exists:d or d:size<>s:size or d:datetime<>s:d
          total += s size
      fixed
        status := success
        var Intn done := 0
        for (var Int i) 0 src_files:size-1
          var Pointer:FileInfo s :> src_files i
          var Pointer:FileInfo d :> dest_dict first s:name
          if not exists:d
            text "+ "+s:name
            var FileInfo d2 := file_query (path_concat dest_
            s name := path_concat src_path s:name
            if (file_copy s d2 extended)=failure
              status := failure ; text " FAILED"
            done += s size ; text "  "+(string 100*done\tota
            flush
          eif d:size<>s:size or d:datetime<>s:datetime
            text "* "+s:name
            s name := path_concat src_path s:name
            d name := path_concat dest_path d:name
            if (file_copy s d extended)=failure
              status := failure ; text " FAILED"
            done += s size ; text "  "+(string 100*done\tota
            flush
        for (var Int i) 0 dest_files:size-1
          var Pointer:FileInfo d :> dest_files i
          var Pointer:FileInfo s :> src_dict first d:name
          if not exists:s
            text "- "+d:name
            if file_delete:(path_concat dest_path d:name)=fa
              status := failure ; text " FAILED"
            eol
            flush
        if not (options option "nodelete")
          for (var Int i) 0 dest_files:size-1
            var Pointer:FileInfo d :> dest_files i
            var Pointer:FileInfo s :> src_dict first d:name
            if not exists:s
              text "- "+d:name
              if file_delete:(path_concat dest_path d:name)=failure
                status := failure ; text " FAILED"
              eol
              flush


function file_url site path user password -> url
  arg Str site path user password url
  if site<>""
    if not (site parse any:(var Str host) ":" (var Int port)
      host := site
      var Data:NameHost h :> name_database:data:host site
      if exists:h
        port := h http_port
      else
        var Data:Site s :> site_database:data:site site
        if exists:s and s:port=defined
          port := s port
        else
          port := 80
    if (path parse "/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/file/"+subpath
    eif (path parse "file:/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/system_file/"+su
    eif (path parse "embedded:/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/system_file/debi
    else
      return ""
    url := string:url+" channel "+(string "channel://"+host+
  else
    url := path
  
method page file_tree_synchronize src_site src_path dest_sit
  arg_rw HtmlPage page ; arg Str src_site src_path dest_site


function file_url site path user password -> url
  arg Str site path user password url
  if site<>""
    if not (site parse any:(var Str host) ":" (var Int port)
      host := site
      var Data:NameHost h :> name_database:data:host site
      if exists:h
        port := h http_port
      else
        var Data:Site s :> site_database:data:site site
        if exists:s and s:port=defined
          port := s port
        else
          port := 80
    if (path parse "/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/file/"+subpath
    eif (path parse "file:/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/system_file/"+su
    eif (path parse "embedded:/" any:(var Str subpath))
      url := "http://"+host+"/pliant/browse/system_file/debi
    else
      return ""
    url := string:url+" channel "+(string "channel://"+host+
  else
    url := path
  
method page file_tree_synchronize src_site src_path dest_sit
  arg_rw HtmlPage page ; arg Str src_site src_path dest_site
  if user_secret_database:data:user:user:key_md5<>"" and use
  if user_secret_database:data:user:user:key_md5<>"" and user_secret_database:data:user:user:key_md5<>string_md5_hexa_signature:(uncipher (straight_to_Str user_secret_database:data:user:user:private_key) password)
    page text "Password for '"+user+"' is wrong."
    return failure
  var Str src_url := file_url src_site src_path user passwor
  if src_url=""
    page text "I don't know how to access "+src_path+" on "+
    return failure
  var Str dest_url := file_url dest_site dest_path user pass
  if dest_url=""
    page text "I don't know how to access "+dest_path+" on "
    return failure
  status := page file_tree_synchronize src_url dest_url opti


export '. file_tree_synchronize' file_url
    page text "Password for '"+user+"' is wrong."
    return failure
  var Str src_url := file_url src_site src_path user passwor
  if src_url=""
    page text "I don't know how to access "+src_path+" on "+
    return failure
  var Str dest_url := file_url dest_site dest_path user pass
  if dest_url=""
    page text "I don't know how to access "+dest_path+" on "
    return failure
  status := page file_tree_synchronize src_url dest_url opti


export '. file_tree_synchronize' file_url