[Unison-hackers] Does copyprog option do not work for local files?
netawater
standin-000 at tianya.cn
Tue Mar 31 11:01:45 EDT 2009
Benjamin Pierce <bcpierce at cis.upenn.edu> writes:
> OK, attached is a hacked version of copy.ml that uses copyprog also
> for local transfers. It has been tested on exactly one example.
>
> I'm afraid I won't be able to help any more with this -- there's a
> long list of Unison things to be fixed and very limited time for
> working on them. But I hope it gets you started.
>
> Best,
>
> - Benjamin
>
>
>
>
>
>
>
> On Mar 30, 2009, at 4:26 AM, netawater wrote:
>
>> 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!
>>
>> _______________________________________________
>> Unison-hackers mailing list
>> Unison-hackers at lists.seas.upenn.edu
>> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers
>
> _______________________________________________
> Unison-hackers mailing list
> Unison-hackers at lists.seas.upenn.edu
> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers
You are very kind, thanks very much!
More information about the Unison-hackers
mailing list