Patch title: Release 81 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"


    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
module "/pliant/language/unsafe.pli"
module "/pliant/admin/file.pli"
module "/pliant/language/stream/filesystembase.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
      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 (options option "touched")
            var Str temp := file_temporary
            if (file_copy (path_concat src_path s:name) temp reduced)=success and file_md5_hexa_signature:(path_concat dest_path d:name)=file_md5_hexa_signature: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
      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
          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
      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)." ; eol
        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



export '. file_tree_synchronize'
        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



export '. file_tree_synchronize'