Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option

2020-07-16 Thread Ihor Radchenko
> Indeed, as long as org-attach introduced new async actions. Those hooks will
> have problem if they requires files is downloading finished. Also 
> `make-thread'
> does not have process sentinel. That's also an problem.
>
> Does anyone have better idea?

You can wrap the call to org-attach-url-function into with-mutex and run
hooks in another thread ustilising the same mutex.
Note that the heading contents (including :DIR: property), point,
current buffer, and window might be changed at the time the hook thread
will be called. You will need to perform some sanity checks and
potentially cleanup after org-attach-url-function if the heading was
modified in some undesired way.

The above assumes that org-attach-url-function returns after the file is
attached. This might not be the case if org-attach-url-function calls
async shell command. This should be either documented or also handled in
some way.

Best,
Ihor

stardiviner  writes:

> Ihor Radchenko  writes:
>
>> I do not know an answer to your question, but would like to point out
>> that make-thread will return immidietealy and all the following code
>> will run before the download finishes:
>>
>> (run-hook-with-args 'org-attach-after-change-hook attach-dir)
>> (org-attach-tag)
>> (cond ((eq org-attach-store-link-p 'attached)...
>>
>> At least the hooks and org-attach-tag would expect that the file is
>> attached already.
>
> Indeed, as long as org-attach introduced new async actions. Those hooks will
> have problem if they requires files is downloading finished. Also 
> `make-thread'
> does not have process sentinel. That's also an problem.
>
> Does anyone have better idea?
>
>>
>> Best,
>> Ihor
>>
>> stardiviner  writes:
>>
>>> I got solution for async org-attach-url now. Use `make-thread` for async
>>> downloading is simple.
>>>
>>> Here is the code prototype, but it has a problem, seems `apply` part code 
>>> does
>>> not really downloading file. I don't know why. Does anybody knows the 
>>> reason?
>>>
>>> #+begin_src diff
>>> modified   lisp/org-attach.el
>>> @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp
>>>   (const :tag "Hard Link" ln)
>>>   (const :tag "Symbol Link" lns)))
>>>  
>>> +(defcustom org-attach-url-function 'url-copy-file
>>> +  "The download file function to use in org-attach-url."
>>> +  :type '(choice (const 'url-copy-file))
>>> +  :safe #'functionp
>>> +  :group 'org-attach)
>>> +
>>>  (defcustom org-attach-expert nil
>>>"Non-nil means do not show the splash buffer with the attach dispatcher."
>>>:group 'org-attach
>>> @@ -503,7 +509,12 @@ (defun org-attach-attach (file  visit-dir 
>>> method)
>>> ((eq method 'cp) (copy-file file attach-file))
>>> ((eq method 'ln) (add-name-to-file file attach-file))
>>> ((eq method 'lns) (make-symbolic-link file attach-file))
>>> -   ((eq method 'url) (url-copy-file file attach-file)))
>>> +   ((eq method 'url) (make-thread
>>> + (lambda ()
>>> +   ;; (url-copy-file file attach-file)
>>> +   ;; FIXME This seems does not really download file. 
>>> Don't know why.
>>> +   (apply org-attach-url-function '(file attach-file)))
>>> + "org-attach-url downloading")))
>>>(run-hook-with-args 'org-attach-after-change-hook attach-dir)
>>>(org-attach-tag)
>>>(cond ((eq org-attach-store-link-p 'attached)
>>> #+end_src
>>>
>>> Bastien  writes:
>>>
 Hi,

 stardiviner  writes:

> I found when network is bad and slow, or the download file is big, the
> org-attach-url will suspend Emacs for a long time. User might have to 
> cancel
> downloading, and start again later.

 Indeed, this might be annoying.  At the same time, it is not
 unreasonable to expect the user to know what size is the contents he
 is willing to attach to an Org node.

> I hope to make "org-attach-url" download file asynchronously. But function
> org-attach-attach hardcoded this function for 'url method. Here is a 
> patch to
> make it into an option.

 (FWIW, I could not find the patch.)

 I think you are on the right track when trying to enhance the 'url
 package.  Maybe url-copy-file should be asynchronous and url could
 provide url-copy-file-synchronously (to mimic the url-retrieve and
 url-retrieve-synchronously pair)?

 Until Emacs has a function to copy a URL's contents asynchronously,
 I'd rather not add this functionality in Org.
>>>
>>>
>>> -- 
>>> [ stardiviner ]
>>>I try to make every word tell the meaning that I want to express.
>>>
>>>Blog: https://stardiviner.github.io/
>>>IRC(freenode): stardiviner, Matrix: stardiviner
>>>GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
>>>
>
>
> -- 
> [ stardiviner ]
>I try to make every word tell the meaning that I want to express.
>
>Blog: 

Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option

2020-07-16 Thread stardiviner


Ihor Radchenko  writes:

> I do not know an answer to your question, but would like to point out
> that make-thread will return immidietealy and all the following code
> will run before the download finishes:
>
> (run-hook-with-args 'org-attach-after-change-hook attach-dir)
> (org-attach-tag)
> (cond ((eq org-attach-store-link-p 'attached)...
>
> At least the hooks and org-attach-tag would expect that the file is
> attached already.

Indeed, as long as org-attach introduced new async actions. Those hooks will
have problem if they requires files is downloading finished. Also `make-thread'
does not have process sentinel. That's also an problem.

Does anyone have better idea?

>
> Best,
> Ihor
>
> stardiviner  writes:
>
>> I got solution for async org-attach-url now. Use `make-thread` for async
>> downloading is simple.
>>
>> Here is the code prototype, but it has a problem, seems `apply` part code 
>> does
>> not really downloading file. I don't know why. Does anybody knows the reason?
>>
>> #+begin_src diff
>> modified   lisp/org-attach.el
>> @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp
>>(const :tag "Hard Link" ln)
>>(const :tag "Symbol Link" lns)))
>>  
>> +(defcustom org-attach-url-function 'url-copy-file
>> +  "The download file function to use in org-attach-url."
>> +  :type '(choice (const 'url-copy-file))
>> +  :safe #'functionp
>> +  :group 'org-attach)
>> +
>>  (defcustom org-attach-expert nil
>>"Non-nil means do not show the splash buffer with the attach dispatcher."
>>:group 'org-attach
>> @@ -503,7 +509,12 @@ (defun org-attach-attach (file  visit-dir 
>> method)
>> ((eq method 'cp) (copy-file file attach-file))
>> ((eq method 'ln) (add-name-to-file file attach-file))
>> ((eq method 'lns) (make-symbolic-link file attach-file))
>> -   ((eq method 'url) (url-copy-file file attach-file)))
>> +   ((eq method 'url) (make-thread
>> +  (lambda ()
>> +;; (url-copy-file file attach-file)
>> +;; FIXME This seems does not really download file. 
>> Don't know why.
>> +(apply org-attach-url-function '(file attach-file)))
>> +  "org-attach-url downloading")))
>>(run-hook-with-args 'org-attach-after-change-hook attach-dir)
>>(org-attach-tag)
>>(cond ((eq org-attach-store-link-p 'attached)
>> #+end_src
>>
>> Bastien  writes:
>>
>>> Hi,
>>>
>>> stardiviner  writes:
>>>
 I found when network is bad and slow, or the download file is big, the
 org-attach-url will suspend Emacs for a long time. User might have to 
 cancel
 downloading, and start again later.
>>>
>>> Indeed, this might be annoying.  At the same time, it is not
>>> unreasonable to expect the user to know what size is the contents he
>>> is willing to attach to an Org node.
>>>
 I hope to make "org-attach-url" download file asynchronously. But function
 org-attach-attach hardcoded this function for 'url method. Here is a patch 
 to
 make it into an option.
>>>
>>> (FWIW, I could not find the patch.)
>>>
>>> I think you are on the right track when trying to enhance the 'url
>>> package.  Maybe url-copy-file should be asynchronous and url could
>>> provide url-copy-file-synchronously (to mimic the url-retrieve and
>>> url-retrieve-synchronously pair)?
>>>
>>> Until Emacs has a function to copy a URL's contents asynchronously,
>>> I'd rather not add this functionality in Org.
>>
>>
>> -- 
>> [ stardiviner ]
>>I try to make every word tell the meaning that I want to express.
>>
>>Blog: https://stardiviner.github.io/
>>IRC(freenode): stardiviner, Matrix: stardiviner
>>GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
>>


-- 
[ stardiviner ]
   I try to make every word tell the meaning that I want to express.

   Blog: https://stardiviner.github.io/
   IRC(freenode): stardiviner, Matrix: stardiviner
   GPG: F09F650D7D674819892591401B5DF1C95AE89AC3



Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option

2020-07-15 Thread Ihor Radchenko
I do not know an answer to your question, but would like to point out
that make-thread will return immidietealy and all the following code
will run before the download finishes:

(run-hook-with-args 'org-attach-after-change-hook attach-dir)
(org-attach-tag)
(cond ((eq org-attach-store-link-p 'attached)...

At least the hooks and org-attach-tag would expect that the file is
attached already.

Best,
Ihor

stardiviner  writes:

> I got solution for async org-attach-url now. Use `make-thread` for async
> downloading is simple.
>
> Here is the code prototype, but it has a problem, seems `apply` part code does
> not really downloading file. I don't know why. Does anybody knows the reason?
>
> #+begin_src diff
> modified   lisp/org-attach.el
> @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp
> (const :tag "Hard Link" ln)
> (const :tag "Symbol Link" lns)))
>  
> +(defcustom org-attach-url-function 'url-copy-file
> +  "The download file function to use in org-attach-url."
> +  :type '(choice (const 'url-copy-file))
> +  :safe #'functionp
> +  :group 'org-attach)
> +
>  (defcustom org-attach-expert nil
>"Non-nil means do not show the splash buffer with the attach dispatcher."
>:group 'org-attach
> @@ -503,7 +509,12 @@ (defun org-attach-attach (file  visit-dir 
> method)
> ((eq method 'cp) (copy-file file attach-file))
> ((eq method 'ln) (add-name-to-file file attach-file))
> ((eq method 'lns) (make-symbolic-link file attach-file))
> -   ((eq method 'url) (url-copy-file file attach-file)))
> +   ((eq method 'url) (make-thread
> +   (lambda ()
> + ;; (url-copy-file file attach-file)
> + ;; FIXME This seems does not really download file. 
> Don't know why.
> + (apply org-attach-url-function '(file attach-file)))
> +   "org-attach-url downloading")))
>(run-hook-with-args 'org-attach-after-change-hook attach-dir)
>(org-attach-tag)
>(cond ((eq org-attach-store-link-p 'attached)
> #+end_src
>
> Bastien  writes:
>
>> Hi,
>>
>> stardiviner  writes:
>>
>>> I found when network is bad and slow, or the download file is big, the
>>> org-attach-url will suspend Emacs for a long time. User might have to cancel
>>> downloading, and start again later.
>>
>> Indeed, this might be annoying.  At the same time, it is not
>> unreasonable to expect the user to know what size is the contents he
>> is willing to attach to an Org node.
>>
>>> I hope to make "org-attach-url" download file asynchronously. But function
>>> org-attach-attach hardcoded this function for 'url method. Here is a patch 
>>> to
>>> make it into an option.
>>
>> (FWIW, I could not find the patch.)
>>
>> I think you are on the right track when trying to enhance the 'url
>> package.  Maybe url-copy-file should be asynchronous and url could
>> provide url-copy-file-synchronously (to mimic the url-retrieve and
>> url-retrieve-synchronously pair)?
>>
>> Until Emacs has a function to copy a URL's contents asynchronously,
>> I'd rather not add this functionality in Org.
>
>
> -- 
> [ stardiviner ]
>I try to make every word tell the meaning that I want to express.
>
>Blog: https://stardiviner.github.io/
>IRC(freenode): stardiviner, Matrix: stardiviner
>GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
>

-- 
Ihor Radchenko,
PhD,
Center for Advancing Materials Performance from the Nanoscale (CAMP-nano)
State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong 
University, Xi'an, China
Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg



[QUESTION] Re: [PATCH] make org-attach-url download function as an option

2020-07-15 Thread stardiviner


I got solution for async org-attach-url now. Use `make-thread` for async
downloading is simple.

Here is the code prototype, but it has a problem, seems `apply` part code does
not really downloading file. I don't know why. Does anybody knows the reason?

#+begin_src diff
modified   lisp/org-attach.el
@@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp
  (const :tag "Hard Link" ln)
  (const :tag "Symbol Link" lns)))
 
+(defcustom org-attach-url-function 'url-copy-file
+  "The download file function to use in org-attach-url."
+  :type '(choice (const 'url-copy-file))
+  :safe #'functionp
+  :group 'org-attach)
+
 (defcustom org-attach-expert nil
   "Non-nil means do not show the splash buffer with the attach dispatcher."
   :group 'org-attach
@@ -503,7 +509,12 @@ (defun org-attach-attach (file  visit-dir method)
((eq method 'cp) (copy-file file attach-file))
((eq method 'ln) (add-name-to-file file attach-file))
((eq method 'lns) (make-symbolic-link file attach-file))
-   ((eq method 'url) (url-copy-file file attach-file)))
+   ((eq method 'url) (make-thread
+ (lambda ()
+   ;; (url-copy-file file attach-file)
+   ;; FIXME This seems does not really download file. 
Don't know why.
+   (apply org-attach-url-function '(file attach-file)))
+ "org-attach-url downloading")))
   (run-hook-with-args 'org-attach-after-change-hook attach-dir)
   (org-attach-tag)
   (cond ((eq org-attach-store-link-p 'attached)
#+end_src

Bastien  writes:

> Hi,
>
> stardiviner  writes:
>
>> I found when network is bad and slow, or the download file is big, the
>> org-attach-url will suspend Emacs for a long time. User might have to cancel
>> downloading, and start again later.
>
> Indeed, this might be annoying.  At the same time, it is not
> unreasonable to expect the user to know what size is the contents he
> is willing to attach to an Org node.
>
>> I hope to make "org-attach-url" download file asynchronously. But function
>> org-attach-attach hardcoded this function for 'url method. Here is a patch to
>> make it into an option.
>
> (FWIW, I could not find the patch.)
>
> I think you are on the right track when trying to enhance the 'url
> package.  Maybe url-copy-file should be asynchronous and url could
> provide url-copy-file-synchronously (to mimic the url-retrieve and
> url-retrieve-synchronously pair)?
>
> Until Emacs has a function to copy a URL's contents asynchronously,
> I'd rather not add this functionality in Org.


-- 
[ stardiviner ]
   I try to make every word tell the meaning that I want to express.

   Blog: https://stardiviner.github.io/
   IRC(freenode): stardiviner, Matrix: stardiviner
   GPG: F09F650D7D674819892591401B5DF1C95AE89AC3