[Unison-hackers] Does copyprog option do not work for local files?

netawater standin-000 at tianya.cn
Mon Mar 30 04:26:52 EDT 2009


Benjamin Pierce <bcpierce at cis.upenn.edu> writes:

> If you only care about the file contents (not permissions, etc.), you  
> should be able to replace the body of Copy.localFile with an  
> invocation of your external copy program by calling  
> External.runExternalProgram.
>
> However, depending on what you feel your time is worth, I wonder  
> whether just replacing the network drive with one that works might not  
> be a better solution...
>
> Best,
>
>     - Benjamin
>
>
>
> On Mar 29, 2009, at 3:37 AM, netawater wrote:
>
>> Alan Schmitt <alan.schmitt at polytechnique.org> writes:
>>
>>> On 28 mars 09, at 06:44, netawater wrote:
>>>
>>>> I try use unison to synchronize my files with copyprog option, I
>>>> have set copythreshold = 0, but It seems unison does not call my
>>>> copy program.
>>>>
>>>> I have studied the copy.ml, and found these expressions in file
>>>> function
>>>>
>>>> match rootFrom, rootTo with
>>>>   (Common.Local, fspathFrom), (Common.Local, realFspathTo) ->
>>>>     localFile
>>>>       fspathFrom pathFrom fspathTo pathTo realPathTo
>>>>       update desc (Osx.ressLength ress) (Some id);
>>>>     Lwt.return ()
>>>>
>>>> It means if it found there are local files, it will call localFile
>>>> function
>>>> so that copyprog is ignored.
>>>
>>> Yes, it is correct. To be precise, copyprog is called:
>>> - when one file is remote
>>> - when the remote file is missing (i.e. it's a file creation, not a
>>> file modification)
>>> - when the remote file is bigger than the threshold.
>>>
>>> Alan
>>> _______________________________________________
>>> Unison-hackers mailing list
>>> Unison-hackers at lists.seas.upenn.edu
>>> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers
>>
>> Thanks for you reply.
>>
>> My situation is I want to synchronize my files from my local driver C:
>> to a network driver \\Wua141699 in Windows. The network drive is not
>> very stable and I need use my copy program to copy and verify files
>> instead unison's native copy method.
>>
>> Can I make this happen? I have tried hard but I can not finish it.
>>
>> _______________________________________________
>> Unison-hackers mailing list
>> Unison-hackers at lists.seas.upenn.edu
>> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers

Thank you! My network drive is produced by Wuala and I like its p2p
online storage, so I do not want to change it.

I have tried modify localfile like this:

let localFile
     (* fspathFrom pathFrom fspathTo pathTo realPathTo update desc ressLength ido =
     *)
    rootFrom pathFrom fspathTo pathTo realPathTo update desc ressLength ido =
  (* Plato Wu,2009/03/30: use External.runExternalProgram instead *)
  targetExistsLocal
      rootFrom (`MakeWriteableAndCheckNonempty, fspathTo, pathTo) >>= (fun b ->
   let prog =
      if b
        then Prefs.read copyprogrest
        else Prefs.read copyprog in
    let fromSpec =
        (formatConnectionInfo rootFrom)
      ^ (Fspath.concatToString (snd rootFrom) pathFrom) in
    let toSpec =
      (*   (formatConnectionInfo rootTo) ^  *)
      (Fspath.concatToString fspathTo pathTo) in
    let cmd = prog ^ " "
               ^ (Os.quotes fromSpec) ^ " "
               ^ (Os.quotes toSpec) in
    Trace.log (Printf.sprintf "%s\n" cmd);
    let _,log = Os.runExternalProgram cmd in
    debug (fun() ->
             let l = Util.trimWhitespace log in
             Util.msg "transferFileUsingExternalCopyprog %s: returned...\n%s%s"
               (Path.toString pathFrom)
               l (if l="" then "" else "\n"));
    targetExistsLocal
      rootFrom (`CheckDataSize desc, fspathTo, pathTo)
        >>= (fun b ->
    if not b then
      raise (Util.Transient (Printf.sprintf
        "External copy program did not create target file (or bad length): %s"
            (Path.toString pathTo)));
(*     Uutil.showProgress id (Props.length desc) "ext"; *)
	  Lwt.return (match update with
        `Update _ ->
          Fileinfo.set fspathTo pathTo (`Copy realPathTo) desc
      | `Copy ->
          Fileinfo.set fspathTo pathTo (`Set Props.fileDefault) desc) ));
     
I know little about Ocaml's grammar and semantic, so I struggled in
modification and compilation, can you help me to finish this function.
Thank you very much!



More information about the Unison-hackers mailing list