* Using babel to generate a commit log
@ 2011-03-30 5:38 Luke Crook
2011-03-30 6:26 ` Jambunathan K
` (3 more replies)
0 siblings, 4 replies; 23+ messages in thread
From: Luke Crook @ 2011-03-30 5:38 UTC (permalink / raw)
To: emacs-orgmode
I have written the following code that uses the Emacs vc-* commands to generate
a commit log. I would like the output of this code to be included when my file
is exported.
#+begin_src emacs-lisp :var limit=""
;; Most of this code is copied from vc.el vc-print-log
(when (vc-find-backend-function (vc-backend (buffer-file-name (current-buffer)))
'print-log)
(let* ((limit (if (numberp limit) limit vc-log-show-limit))
(vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
(backend (car vc-fileset))
(files (cadr vc-fileset)))
(with-temp-buffer
(vc-call-backend backend
'print-log
files
(current-buffer))
(sit-for 5 t)
(buffer-string))))
#+end_src
What is happening is;
1) The code between #+begin_src and #+end_src is exported and not the result
of evaluating the code (the commit log).
2) I have to add at delay of at least 5 seconds (set-for 5 t) as vc-git calls
"git log" as an asynchronous process. If not for the delay then babel
immediately returns an empty buffer and the "vc-call-backend" process never
completes.
How can I fix (1).
Is there a better way that I can accomplish (2) ?
Thanks,
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 5:38 Using babel to generate a commit log Luke Crook
@ 2011-03-30 6:26 ` Jambunathan K
2011-03-30 7:57 ` Luke Crook
2011-03-30 6:28 ` Suvayu Ali
` (2 subsequent siblings)
3 siblings, 1 reply; 23+ messages in thread
From: Jambunathan K @ 2011-03-30 6:26 UTC (permalink / raw)
To: Luke Crook; +Cc: emacs-orgmode
Luke Crook <luke@balooga.com> writes:
> I have written the following code that uses the Emacs vc-* commands to generate
> a commit log. I would like the output of this code to be included when my file
> is exported.
>
> #+begin_src emacs-lisp :var limit=""
> ;; Most of this code is copied from vc.el vc-print-log
> (when (vc-find-backend-function (vc-backend (buffer-file-name (current-buffer)))
> 'print-log)
> (let* ((limit (if (numberp limit) limit vc-log-show-limit))
> (vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
> (backend (car vc-fileset))
> (files (cadr vc-fileset)))
> (with-temp-buffer
> (vc-call-backend backend
> 'print-log
> files
> (current-buffer))
> (sit-for 5 t)
> (buffer-string))))
> #+end_src
>
> What is happening is;
>
> 1) The code between #+begin_src and #+end_src is exported and not the result
> of evaluating the code (the commit log).
> 2) I have to add at delay of at least 5 seconds (set-for 5 t) as vc-git calls
> "git log" as an asynchronous process. If not for the delay then babel
> immediately returns an empty buffer and the "vc-call-backend" process never
> completes.
>
> How can I fix (1).
>
> Is there a better way that I can accomplish (2) ?
Quick hints if you are willing to settle for some hacks.
In vc-do-command, you may have to set OKSTATUS to 0. Track
`vc-disable-async-diff' in vc.el and vc-svn.el for possible hints.
,----[ C-h f vc-do-command RET ]
| vc-do-command is an autoloaded Lisp function in `vc-dispatcher.el'.
|
| (vc-do-command BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)
|
| Execute a slave command, notifying user and checking for errors.
| Output from COMMAND goes to BUFFER, or the current buffer if
| BUFFER is t. If the destination buffer is not already current,
| set it up properly and erase it. The command is considered
| successful if its exit status does not exceed OKSTATUS (if
| OKSTATUS is nil, that means to ignore error status, if it is
| `async', that means not to wait for termination of the
| subprocess; if it is t it means to ignore all execution errors).
| FILE-OR-LIST is the name of a working file; it may be a list of
| files or be nil (to execute commands that don't expect a file
| name or set of files). If an optional list of FLAGS is present,
| that is inserted into the command line before the filename.
| Return the return value of the slave command in the synchronous
| case, and the process object in the asynchronous case.
|
| [back]
`----
,----[ C-h v vc-disable-async-diff RET ]
| vc-disable-async-diff is a variable defined in `vc.el'.
| Its value is nil
|
| Documentation:
| VC sets this to t locally to disable some async diff operations.
| Backends that offer asynchronous diffs should respect this variable
| in their implementation of vc-BACKEND-diff.
|
| [back]
`----
>
> Thanks,
> -Luke
>
>
>
>
--
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 6:26 ` Jambunathan K
@ 2011-03-30 7:57 ` Luke Crook
2011-03-30 13:43 ` Nick Dokos
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 7:57 UTC (permalink / raw)
To: emacs-orgmode
Jambunathan K <kjambunathan <at> gmail.com> writes:
>
> Luke Crook <luke <at> balooga.com> writes:
>
> > 2) I have to add at delay of at least 5 seconds (set-for 5 t) as vc-git
calls
> > "git log" as an asynchronous process. If not for the delay then babel
> > immediately returns an empty buffer and the "vc-call-backend" process never
> > completes.
> >
> > Is there a better way that I can accomplish (2) ?
>
> Quick hints if you are willing to settle for some hacks.
>
> In vc-do-command, you may have to set OKSTATUS to 0. Track
> `vc-disable-async-diff' in vc.el and vc-svn.el for possible hints.
>
I changed my code to wait until the 'Git' process completes. Luckily "vc-call-
backend" returns the async process.
#+begin_src emacs-lisp :var limit="" :file test.log :exports results
;; Most of this code is copied from vc.el vc-print-log
(when (vc-find-backend-function (vc-backend (buffer-file-name (current-buffer)))
'print-log)
(let* ((limit (if (numberp limit) limit vc-log-show-limit))
(vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
(backend (car vc-fileset))
(files (cadr vc-fileset)))
(with-temp-buffer
(let ((status (vc-call-backend backend
'print-log
files
(current-buffer))))
(while (not (eq 'exit (process-status status)))
(sit-for 1 t))
(buffer-string)))))
#+end_src
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 7:57 ` Luke Crook
@ 2011-03-30 13:43 ` Nick Dokos
2011-03-30 18:08 ` Luke Crook
0 siblings, 1 reply; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 13:43 UTC (permalink / raw)
To: Luke Crook; +Cc: nicholas.dokos, emacs-orgmode
Luke Crook <luke@balooga.com> wrote:
> Jambunathan K <kjambunathan <at> gmail.com> writes:
>
> >
> > Luke Crook <luke <at> balooga.com> writes:
> >
> > > 2) I have to add at delay of at least 5 seconds (set-for 5 t) as vc-git
> calls
> > > "git log" as an asynchronous process. If not for the delay then babel
> > > immediately returns an empty buffer and the "vc-call-backend" process never
> > > completes.
> > >
> > > Is there a better way that I can accomplish (2) ?
> >
> > Quick hints if you are willing to settle for some hacks.
> >
> > In vc-do-command, you may have to set OKSTATUS to 0. Track
> > `vc-disable-async-diff' in vc.el and vc-svn.el for possible hints.
> >
>
> I changed my code to wait until the 'Git' process completes. Luckily "vc-call-
> backend" returns the async process.
>
Oh, I missed that - thanks for pointing it out.
> #+begin_src emacs-lisp :var limit="" :file test.log :exports results
> ;; Most of this code is copied from vc.el vc-print-log
> (when (vc-find-backend-function (vc-backend (buffer-file-name (current-buffer)))
> 'print-log)
> (let* ((limit (if (numberp limit) limit vc-log-show-limit))
> (vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
> (backend (car vc-fileset))
> (files (cadr vc-fileset)))
> (with-temp-buffer
> (let ((status (vc-call-backend backend
> 'print-log
> files
> (current-buffer))))
> (while (not (eq 'exit (process-status status)))
> (sit-for 1 t))
> (buffer-string)))))
> #+end_src
>
... or you could use a sentinel :-)
One bit of defensive programming might be to check that status *is* a
process before you do the wait: vc-do-command returns a real status in
the synchronous case, so if you cut-n-paste this code with some other
command that does not use async, it'll blow up.
Nick
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 13:43 ` Nick Dokos
@ 2011-03-30 18:08 ` Luke Crook
2011-03-30 18:42 ` Nick Dokos
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 18:08 UTC (permalink / raw)
To: emacs-orgmode
Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> Luke Crook <luke <at> balooga.com> wrote:
>
> > Jambunathan K <kjambunathan <at> gmail.com> writes:
> >
> > >
> >
> > I changed my code to wait until the 'Git' process completes. Luckily "vc-
call-
> > backend" returns the async process.
> >
>
> ... or you could use a sentinel
>
> One bit of defensive programming might be to check that status *is* a
> process before you do the wait: vc-do-command returns a real status in
> the synchronous case, so if you cut-n-paste this code with some other
> command that does not use async, it'll blow up.
>
I have modified the code to only check the status if the process is actually
running;
(with-temp-buffer
(let ((status (vc-call-backend backend
'print-log
files
(current-buffer))))
(when (= 0 (process-exit-status status))
(while (not (eq 'exit (process-status status)))
(sit-for 1 t)))
I'm not sure about using a sentinel though as this is just a callback that is
executed when the process completes. Wouldn't the sentinel fire after the source
block has returned?
Or do you mean to wait until a variable set by the sentinel returns t?
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 18:08 ` Luke Crook
@ 2011-03-30 18:42 ` Nick Dokos
0 siblings, 0 replies; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 18:42 UTC (permalink / raw)
To: Luke Crook; +Cc: nicholas.dokos, emacs-orgmode
Luke Crook <luke@balooga.com> wrote:
> Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> >
> > Luke Crook <luke <at> balooga.com> wrote:
> >
> > > Jambunathan K <kjambunathan <at> gmail.com> writes:
> > >
> > > >
> > >
> > > I changed my code to wait until the 'Git' process completes. Luckily "vc-
> call-
> > > backend" returns the async process.
> > >
> >
> > ... or you could use a sentinel
> >
> > One bit of defensive programming might be to check that status *is* a
> > process before you do the wait: vc-do-command returns a real status in
> > the synchronous case, so if you cut-n-paste this code with some other
> > command that does not use async, it'll blow up.
> >
>
> I have modified the code to only check the status if the process is actually
> running;
>
> (with-temp-buffer
> (let ((status (vc-call-backend backend
> 'print-log
> files
> (current-buffer))))
> (when (= 0 (process-exit-status status))
> (while (not (eq 'exit (process-status status)))
> (sit-for 1 t)))
>
I meant something like this:
(if (processp status)
...do the process stuff)
It's not a problem here since vc-call-backend will always call print-log
asynchronously, so status will always be a process, but if you use this
code somewhere else with a different command that is *not* done
asynchronously, then you'll have a problem. Not a biggie.
> I'm not sure about using a sentinel though as this is just a callback that is
> executed when the process completes. Wouldn't the sentinel fire after the source
> block has returned?
>
> Or do you mean to wait until a variable set by the sentinel returns t?
>
Something like the latter: just something to avoid the busy-wait loop,
but again it's a minor nit - the loop works just fine.
Nick
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 5:38 Using babel to generate a commit log Luke Crook
2011-03-30 6:26 ` Jambunathan K
@ 2011-03-30 6:28 ` Suvayu Ali
2011-03-30 7:52 ` Luke Crook
2011-03-30 6:29 ` Nick Dokos
2011-03-30 20:12 ` Eric Schulte
3 siblings, 1 reply; 23+ messages in thread
From: Suvayu Ali @ 2011-03-30 6:28 UTC (permalink / raw)
To: emacs-orgmode
On Wed, 30 Mar 2011 05:38:41 +0000 (UTC)
Luke Crook <luke@balooga.com> wrote:
> 1) The code between #+begin_src and #+end_src is exported and not
> the result of evaluating the code (the commit log).
[...]
>
> How can I fix (1).
>
Have you tried ':exports results' as a header argument?
>
> Thanks,
> -Luke
--
Suvayu
Open source is the future. It sets us free.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 6:28 ` Suvayu Ali
@ 2011-03-30 7:52 ` Luke Crook
2011-03-30 13:07 ` Nick Dokos
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 7:52 UTC (permalink / raw)
To: emacs-orgmode
Suvayu Ali <fatkasuvayu+linux <at> gmail.com> writes:
>
> On Wed, 30 Mar 2011 05:38:41 +0000 (UTC)
> Luke Crook <luke <at> balooga.com> wrote:
>
> > 1) The code between #+begin_src and #+end_src is exported and not
> > the result of evaluating the code (the commit log).
>
> [...]
>
> >
> > How can I fix (1).
> >
>
> Have you tried ':exports results' as a header argument?
>
I just tried ':exports results'. But now I get the following error when
exporting the file, "Cannot open load file: vc-nil"
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 7:52 ` Luke Crook
@ 2011-03-30 13:07 ` Nick Dokos
2011-03-30 15:34 ` Luke Crook
0 siblings, 1 reply; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 13:07 UTC (permalink / raw)
To: Luke Crook; +Cc: nicholas.dokos, emacs-orgmode
Luke Crook <luke@balooga.com> wrote:
> Suvayu Ali <fatkasuvayu+linux <at> gmail.com> writes:
>
> >
> > On Wed, 30 Mar 2011 05:38:41 +0000 (UTC)
> > Luke Crook <luke <at> balooga.com> wrote:
> >
> > > 1) The code between #+begin_src and #+end_src is exported and not
> > > the result of evaluating the code (the commit log).
> >
> > [...]
> >
> > >
> > > How can I fix (1).
> > >
> >
> > Have you tried ':exports results' as a header argument?
> >
>
> I just tried ':exports results'. But now I get the following error when
> exporting the file, "Cannot open load file: vc-nil"
>
That sounds like vc does not know what backend to use: maybe you are not
in a git-controlled directory?
Nick
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 13:07 ` Nick Dokos
@ 2011-03-30 15:34 ` Luke Crook
2011-03-30 16:51 ` Nick Dokos
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 15:34 UTC (permalink / raw)
To: emacs-orgmode
Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> Luke Crook <luke <at> balooga.com> wrote:
>
> > Suvayu Ali <fatkasuvayu+linux <at> gmail.com> writes:
> >
> > > Have you tried ':exports results' as a header argument?
> > >
> >
> > I just tried ':exports results'. But now I get the following error when
> > exporting the file, "Cannot open load file: vc-nil"
> >
>
> That sounds like vc does not know what backend to use: maybe you are not
> in a git-controlled directory?
>
'C-c C-c' at the top of the source block does generate the correct output
though. It is just 'C-c C-e <export backend>' that returns this error.
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 15:34 ` Luke Crook
@ 2011-03-30 16:51 ` Nick Dokos
2011-03-30 17:47 ` Luke Crook
0 siblings, 1 reply; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 16:51 UTC (permalink / raw)
To: Luke Crook; +Cc: nicholas.dokos, emacs-orgmode
Luke Crook <luke@balooga.com> wrote:
> Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> >
> > Luke Crook <luke <at> balooga.com> wrote:
> >
> > > Suvayu Ali <fatkasuvayu+linux <at> gmail.com> writes:
> > >
> > > > Have you tried ':exports results' as a header argument?
> > > >
> > >
> > > I just tried ':exports results'. But now I get the following error when
> > > exporting the file, "Cannot open load file: vc-nil"
> > >
> >
> > That sounds like vc does not know what backend to use: maybe you are not
> > in a git-controlled directory?
> >
>
> 'C-c C-c' at the top of the source block does generate the correct output
> though. It is just 'C-c C-e <export backend>' that returns this error.
>
Right: (current-buffer) is not what you think it is when exporting - it is
the temp buffer that the export mechanism sets up.
There is a way to get the original buffer during capture, but I don't
know of a similar mechanism during export. I hardwired the file name
instead, but I got no further than the vc-fileset call: there seem to be
all sorts of contextual assumptions that vc makes that are violated in
the export context.
Nick
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 16:51 ` Nick Dokos
@ 2011-03-30 17:47 ` Luke Crook
2011-03-30 18:41 ` Luke Crook
2011-03-30 20:10 ` Eric Schulte
0 siblings, 2 replies; 23+ messages in thread
From: Luke Crook @ 2011-03-30 17:47 UTC (permalink / raw)
To: emacs-orgmode
Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> Luke Crook <luke <at> balooga.com> wrote:
>
> > 'C-c C-c' at the top of the source block does generate the correct output
> > though. It is just 'C-c C-e <export backend>' that returns this error.
> >
>
> Right: (current-buffer) is not what you think it is when exporting - it is
> the temp buffer that the export mechanism sets up.
>
> There is a way to get the original buffer during capture, but I don't
> know of a similar mechanism during export. I hardwired the file name
> instead, but I got no further than the vc-fileset call: there seem to be
> all sorts of contextual assumptions that vc makes that are violated in
> the export context.
Yes, this makes sense thanks. I'll create another thread asking how to retrieve
the original buffer during the export process.
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 17:47 ` Luke Crook
@ 2011-03-30 18:41 ` Luke Crook
2011-03-30 20:10 ` Eric Schulte
1 sibling, 0 replies; 23+ messages in thread
From: Luke Crook @ 2011-03-30 18:41 UTC (permalink / raw)
To: emacs-orgmode
Luke Crook <luke <at> balooga.com> writes:
>
> Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
> > There is a way to get the original buffer during capture, but I don't
> > know of a similar mechanism during export. I hardwired the file name
> > instead, but I got no further than the vc-fileset call: there seem to be
> > all sorts of contextual assumptions that vc makes that are violated in
> > the export context.
>
org-publish-initial-buffer provides this when publishing, but I can't find an
equivalent for a standard export.
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 17:47 ` Luke Crook
2011-03-30 18:41 ` Luke Crook
@ 2011-03-30 20:10 ` Eric Schulte
2011-03-30 20:22 ` Nick Dokos
2011-03-30 22:02 ` Luke Crook
1 sibling, 2 replies; 23+ messages in thread
From: Eric Schulte @ 2011-03-30 20:10 UTC (permalink / raw)
To: Luke Crook; +Cc: emacs-orgmode
Luke Crook <luke@balooga.com> writes:
> Nick Dokos <nicholas.dokos <at> hp.com> writes:
>
>>
>> Luke Crook <luke <at> balooga.com> wrote:
>>
>> > 'C-c C-c' at the top of the source block does generate the correct output
>> > though. It is just 'C-c C-e <export backend>' that returns this error.
>> >
>>
>> Right: (current-buffer) is not what you think it is when exporting - it is
>> the temp buffer that the export mechanism sets up.
>>
>> There is a way to get the original buffer during capture, but I don't
>> know of a similar mechanism during export. I hardwired the file name
>> instead, but I got no further than the vc-fileset call: there seem to be
>> all sorts of contextual assumptions that vc makes that are violated in
>> the export context.
>
> Yes, this makes sense thanks. I'll create another thread asking how to retrieve
> the original buffer during the export process.
>
It is true that export takes place in a fresh Org-mode buffer, however
the header arguments of Org-mode code blocks are guaranteed to be
evaluated in the original buffer, so a trick like the following can be
used to grab the original buffer.
#+begin_src emacs-lisp :var buf=(buffer-file-name (current-buffer)) :exports both
(message "buffer %S!" buf)
#+end_src
This issue should be given more prominence in the Org-mode manual, as it
is a common source of confusion.
Cheers -- Eric
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 20:10 ` Eric Schulte
@ 2011-03-30 20:22 ` Nick Dokos
2011-03-30 22:02 ` Luke Crook
1 sibling, 0 replies; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 20:22 UTC (permalink / raw)
To: Eric Schulte; +Cc: nicholas.dokos, emacs-orgmode, Luke Crook
Eric Schulte <schulte.eric@gmail.com> wrote:
> > Yes, this makes sense thanks. I'll create another thread asking how to retrieve
> > the original buffer during the export process.
> >
>
> It is true that export takes place in a fresh Org-mode buffer, however
> the header arguments of Org-mode code blocks are guaranteed to be
> evaluated in the original buffer, so a trick like the following can be
> used to grab the original buffer.
>
> #+begin_src emacs-lisp :var buf=(buffer-file-name (current-buffer)) :exports both
> (message "buffer %S!" buf)
> #+end_src
>
... and there was general rejoicing.
Thanks!
Nick
> This issue should be given more prominence in the Org-mode manual, as it
> is a common source of confusion.
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 20:10 ` Eric Schulte
2011-03-30 20:22 ` Nick Dokos
@ 2011-03-30 22:02 ` Luke Crook
2011-03-30 23:20 ` Luke Crook
1 sibling, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 22:02 UTC (permalink / raw)
To: emacs-orgmode
Eric Schulte <schulte.eric <at> gmail.com> writes:
>
> It is true that export takes place in a fresh Org-mode buffer, however
> the header arguments of Org-mode code blocks are guaranteed to be
> evaluated in the original buffer, so a trick like the following can be
> used to grab the original buffer.
>
> #+begin_src emacs-lisp :var buf=(buffer-file-name (current-buffer)) :exports
both
> (message "buffer %S!" buf)
> #+end_src
>
That is exactly what I need. Thank you very much.
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 22:02 ` Luke Crook
@ 2011-03-30 23:20 ` Luke Crook
2011-03-30 23:44 ` Eric Schulte
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-30 23:20 UTC (permalink / raw)
To: emacs-orgmode
Luke Crook <luke <at> balooga.com> writes:
>
> Eric Schulte <schulte.eric <at> gmail.com> writes:
>
> > #+begin_src emacs-lisp :var buf=(buffer-file-name (current-buffer)) :exports
> both
> > (message "buffer %S!" buf)
> > #+end_src
> >
The following code will now generate the commit log.
#+begin_src emacs-lisp :var limit=-1 :var buf=(buffer-name (current-buffer))
:exports results
;; Most of this code is copied from vc.el vc-print-log
(when (vc-find-backend-function (vc-backend (buffer-file-name (get-buffer buf)))
'print-log)
(let ((limit -1)
(vc-fileset nil)
(backend nil)
(files nil))
(with-current-buffer (get-buffer buf)
(setq vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
(setq backend (car vc-fileset))
(setq files (cadr vc-fileset)))
(with-temp-buffer
(let ((status (vc-call-backend backend
'print-log
files
(current-buffer))))
(when (and (processp status) ;; Make sure status is a process
(= 0 (process-exit-status status))) ;; And that it has not
terminated
(while (not (eq 'exit (process-status status))) ;; Loop and sleep
until complete
(sit-for 1 t)))
(buffer-string)))))
#+end_src
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-30 23:20 ` Luke Crook
@ 2011-03-30 23:44 ` Eric Schulte
2011-03-31 6:49 ` Luke Crook
0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-03-30 23:44 UTC (permalink / raw)
To: Luke Crook; +Cc: emacs-orgmode
Luke Crook <luke@balooga.com> writes:
> Luke Crook <luke <at> balooga.com> writes:
>
>>
>> Eric Schulte <schulte.eric <at> gmail.com> writes:
>>
>> > #+begin_src emacs-lisp :var buf=(buffer-file-name (current-buffer)) :exports
>> both
>> > (message "buffer %S!" buf)
>> > #+end_src
>> >
>
> The following code will now generate the commit log.
>
> #+begin_src emacs-lisp :var limit=-1 :var buf=(buffer-name (current-buffer))
> :exports results
> ;; Most of this code is copied from vc.el vc-print-log
> (when (vc-find-backend-function (vc-backend (buffer-file-name (get-buffer buf)))
> 'print-log)
> (let ((limit -1)
> (vc-fileset nil)
> (backend nil)
> (files nil))
> (with-current-buffer (get-buffer buf)
> (setq vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
> (setq backend (car vc-fileset))
> (setq files (cadr vc-fileset)))
> (with-temp-buffer
> (let ((status (vc-call-backend backend
> 'print-log
> files
> (current-buffer))))
> (when (and (processp status) ;; Make sure status is a process
> (= 0 (process-exit-status status))) ;; And that it has not
> terminated
> (while (not (eq 'exit (process-status status))) ;; Loop and sleep
> until complete
> (sit-for 1 t)))
> (buffer-string)))))
> #+end_src
Great,
Since this could be generally useful would you be willing to add it to
the library of babel (org/contrib/babel/library-of-babel.org)? If so
then if you could supply a few explanatory sentences, I'll add those and
the code block to the library-of-babel.org distributed with Org-mode.
Thanks -- Eric
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 23:44 ` Eric Schulte
@ 2011-03-31 6:49 ` Luke Crook
2011-04-01 0:28 ` Eric Schulte
0 siblings, 1 reply; 23+ messages in thread
From: Luke Crook @ 2011-03-31 6:49 UTC (permalink / raw)
To: emacs-orgmode
Eric Schulte <schulte.eric <at> gmail.com> writes:
>
> Since this could be generally useful would you be willing to add it to
> the library of babel (org/contrib/babel/library-of-babel.org)?
That would be great.
> If so then if you could supply a few explanatory sentences, I'll add those and
> the code block to the library-of-babel.org distributed with Org-mode.
"This function will attempt to retrieve the entire commit log for the file
associated with the current buffer and insert this log into the export. The
function uses the Emacs VC commands to interface to the local version control
system, but has only been tested to work with Git. 'limit' is currently
unsupported."
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Re: Using babel to generate a commit log
2011-03-31 6:49 ` Luke Crook
@ 2011-04-01 0:28 ` Eric Schulte
0 siblings, 0 replies; 23+ messages in thread
From: Eric Schulte @ 2011-04-01 0:28 UTC (permalink / raw)
To: Luke Crook; +Cc: emacs-orgmode
Luke Crook <luke@balooga.com> writes:
> Eric Schulte <schulte.eric <at> gmail.com> writes:
>>
>> Since this could be generally useful would you be willing to add it to
>> the library of babel (org/contrib/babel/library-of-babel.org)?
>
> That would be great.
>
>> If so then if you could supply a few explanatory sentences, I'll add those and
>> the code block to the library-of-babel.org distributed with Org-mode.
>
> "This function will attempt to retrieve the entire commit log for the file
> associated with the current buffer and insert this log into the export. The
> function uses the Emacs VC commands to interface to the local version control
> system, but has only been tested to work with Git. 'limit' is currently
> unsupported."
>
Fantastic, I've now added this to the library-of-babel.org file, so
anyone who loads the library of babel can now call this functionality
through the "" code block, e.g.,
#+call:
Thanks for the contribution! -- Eric
ps. since I can be a bit OCD about these things, I made some aesthetic
indentation and reformatting changes to your elisp.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 5:38 Using babel to generate a commit log Luke Crook
2011-03-30 6:26 ` Jambunathan K
2011-03-30 6:28 ` Suvayu Ali
@ 2011-03-30 6:29 ` Nick Dokos
2011-03-30 20:12 ` Eric Schulte
3 siblings, 0 replies; 23+ messages in thread
From: Nick Dokos @ 2011-03-30 6:29 UTC (permalink / raw)
To: Luke Crook; +Cc: nicholas.dokos, emacs-orgmode
Luke Crook <luke@balooga.com> wrote:
>
> I have written the following code that uses the Emacs vc-* commands to generate
> a commit log. I would like the output of this code to be included when my file
> is exported.
>
>
> ;; Most of this code is copied from vc.el vc-print-log
> (when (vc-find-backend-function (vc-backend (buffer-file-name (current-buffer)))
> 'print-log)
> (let* ((limit (if (numberp limit) limit vc-log-show-limit))
> (vc-fileset (vc-deduce-fileset t)) ;FIXME: Why t? --Stef
> (backend (car vc-fileset))
> (files (cadr vc-fileset)))
> (with-temp-buffer
> (vc-call-backend backend
> 'print-log
> files
> (current-buffer))
> (sit-for 5 t)
> (buffer-string))))
> #+end_src
>
> What is happening is;
>
> 1) The code between #+begin_src and #+end_src is exported and not the result
> of evaluating the code (the commit log).
Try using
--8<---------------cut here---------------start------------->8---
#+begin_src emacs-lisp :var limit="" :exports results
--8<---------------cut here---------------end--------------->8---
> 2) I have to add at delay of at least 5 seconds (set-for 5 t) as vc-git calls
> "git log" as an asynchronous process. If not for the delay then babel
> immediately returns an empty buffer and the "vc-call-backend" process never
> completes.
>
A quick look didn't produce much enlightenment: the standard way is to set
a process sentinel, but this is commented out in vc-do-command. There is also
a hook that is run at the end of the function:
,----
| (vc-exec-after
| `(run-hook-with-args 'vc-post-command-functions
| ',command ',file-or-list ',flags))
`----
but I think you need the process in order to set a sentinel (see sec. 37.10 of
the Elisp manual for info on sentinels).
Nick
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 5:38 Using babel to generate a commit log Luke Crook
` (2 preceding siblings ...)
2011-03-30 6:29 ` Nick Dokos
@ 2011-03-30 20:12 ` Eric Schulte
2011-03-30 21:58 ` Luke Crook
3 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-03-30 20:12 UTC (permalink / raw)
To: Luke Crook; +Cc: emacs-orgmode
Luke Crook <luke@balooga.com> writes:
> I have written the following code that uses the Emacs vc-* commands to generate
> a commit log. I would like the output of this code to be included when my file
> is exported.
>
Is there a reason this processing takes place using Emacs Lisp rather
than a simple shell code block, the following alternative should be
simpler and more robust.
#+begin_src sh :exports results :results output
git log -1
#+end_src
Best -- Eric
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Using babel to generate a commit log
2011-03-30 20:12 ` Eric Schulte
@ 2011-03-30 21:58 ` Luke Crook
0 siblings, 0 replies; 23+ messages in thread
From: Luke Crook @ 2011-03-30 21:58 UTC (permalink / raw)
To: emacs-orgmode
Eric Schulte <schulte.eric <at> gmail.com> writes:
>
> Luke Crook <luke <at> balooga.com> writes:
>
> > I have written the following code that uses the Emacs vc-* commands to
generate
> > a commit log.
> Is there a reason this processing takes place using Emacs Lisp rather
> than a simple shell code block, the following alternative should be
> simpler and more robust.
>
> #+begin_src sh :exports results :results output
> git log -1
> #+end_src
I wanted to abstract away the actual vcs used so that this code could be used by
others having a different vcs.
In my case I only want the commits for the file being exported and not the
previous 'n' commits. I have all my specs in the same git repo.
-Luke
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2011-04-01 0:34 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-30 5:38 Using babel to generate a commit log Luke Crook
2011-03-30 6:26 ` Jambunathan K
2011-03-30 7:57 ` Luke Crook
2011-03-30 13:43 ` Nick Dokos
2011-03-30 18:08 ` Luke Crook
2011-03-30 18:42 ` Nick Dokos
2011-03-30 6:28 ` Suvayu Ali
2011-03-30 7:52 ` Luke Crook
2011-03-30 13:07 ` Nick Dokos
2011-03-30 15:34 ` Luke Crook
2011-03-30 16:51 ` Nick Dokos
2011-03-30 17:47 ` Luke Crook
2011-03-30 18:41 ` Luke Crook
2011-03-30 20:10 ` Eric Schulte
2011-03-30 20:22 ` Nick Dokos
2011-03-30 22:02 ` Luke Crook
2011-03-30 23:20 ` Luke Crook
2011-03-30 23:44 ` Eric Schulte
2011-03-31 6:49 ` Luke Crook
2011-04-01 0:28 ` Eric Schulte
2011-03-30 6:29 ` Nick Dokos
2011-03-30 20:12 ` Eric Schulte
2011-03-30 21:58 ` Luke Crook
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).