Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New parsebib.el parser #452

Open
joostkremers opened this issue Nov 4, 2024 · 23 comments
Open

New parsebib.el parser #452

joostkremers opened this issue Nov 4, 2024 · 23 comments

Comments

@joostkremers
Copy link
Contributor

joostkremers commented Nov 4, 2024

Hi @tmalsburg , bibtex-completion.el depends on parsebib.el, so I wanted to give you a heads-up: I've ripped out the pretty hairy regexp-based parser code and replaced it with a simple recursive descent parser. The new parser works well, and the tests included in parsebib all pass, but with this kind of thing there's always a risk of regressions, of course.

I haven't merged the new code yet, but once I do, you may get bug reports from users that are ultimately caused by parsebib.el. If that happens, just send them to me, or key me in in the discussion.

Some functions have also changed signature, especially parsebib-read-entry, which is used in bibtex-completion.el. You may want to consider using parsebib-parse-bib-buffer or parsebib-collect-bib-entries instead, which will get you all entries in a single function call.

If you have a .bib file that you would like to test the new code with before I do the merge, I'd be happy to do that, or if you prefer, you can check out the code here.

@chuxubank
Copy link

I just find a bug that bibtex-completion-parse-strings runs in infinite loop when use with new parsebib package.
I pin the parsebib to the latest release version (4.7) and it still works well.

So if we want fix it, we should do the change on bibtex-completion side, right?

@joostkremers
Copy link
Contributor Author

joostkremers commented Nov 11, 2024

So if we want fix it, we should do the change on bibtex-completion side, right?

Depends. bibtex-completion needs an update in order to be compatible with the new parsebib.el. If that is indeed the source of the infinite loop, then yes.

I submitted a PR, but it looks like it hasn't been merged yet. Keeping parsebib pinned on 4.7 is the best solution for now. I'm sure @tmalsburg will update bibtex-completion soon.

@tmalsburg
Copy link
Owner

Just merged the PR. Thank you Joost!!

@lnguyen4
Copy link

lnguyen4 commented Nov 14, 2024

Hi, I m having the issue that when I invoke helm-bibtex , it hangs and the mini-buffer says "Parsing bibliography file /home/directorty/myfile.bib".

I got this issue last night and came here to notice there was an update on the dependency parsebib pacakge. So, I then downgraded the parsebib and the issue was gone.

However, today I just updated the bibtex-completion momentarily ago, along with upgrading the parsebib package. But now the hanging issue appears again. It looks like it is looping or something and I had to invoke Ctrl-g to quit it. So, I decided to try again by downgrading the parsebib and keeping the updated helm-bibtex but the error showed up like ignore-member-case: wrong type argument,.... I did try to do package-recompile-all in all of these attempts but it did not help.

I can provide further info but anything I can try? Thanks for helping.

@joostkremers
Copy link
Contributor Author

I don't know about helm (I don't use it), but if parsebib is involved (which is definitely possible, even likely, I'd say), then I'd need to look at the .bib entry that causes the hang. If you're unable to determine that and are willing to share your .bib file or files, feel free to send them to my by e-mail. (You'll find my e-mail address on my profile page).

@gongzhitaao
Copy link

gongzhitaao commented Nov 14, 2024

I'm having the same problem.

I reproduce in the following way:

  1. Start emacs with necessary components only. And it does not have to be straight, I just happen to use straight to download these files.
emacs -Q \
  -l ~/.cache/emacs/straight/build/s/s.elc \
  -l ~/.cache/emacs/straight/build/dash/dash.elc \
  -l ~/.cache/emacs/straight/build/f/f.elc \
  -l ~/.cache/emacs/straight/build/biblio-core/biblio-core.elc \
  -L ~/.cache/emacs/straight/build/biblio/ \
  -l ~/.cache/emacs/straight/build/biblio/biblio.elc \
  -l ~/.cache/emacs/straight/build/parsebib/parsebib.elc \
  -L ~/.cache/emacs/straight/build/org/ \
  -l ~/.cache/emacs/straight/build/bibtex-completion/bibtex-completion.el \
  -L ~/.cache/emacs/straight/build/helm/ \
  -L ~/.cache/emacs/straight/build/helm-core/ \
  -L ~/.cache/emacs/straight/build/async/ \
  -l ~/.cache/emacs/straight/build/helm-bibtex/helm-bibtex.elc
  1. Then (setq bibtex-completion-bibliography "~/ref.bib")
  2. Have the following content in "~/ref.bib"
@Comment @Article{l2024-hire,
@Comment   author          = {{L}, Yashas Samaga B and {Yerram}, Varun and {You}, Chong and {Bhojanapalli}, Srinadh and {Kumar}, Sanjiv and {Jain},
@Comment                      Prateek and {Netrapalli}, Praneeth},
@Comment   title           = {{HiRE: High Recall Approximate Top-$k$ Estimation for Efficient Llm Inference}},
@Comment   journal         = {arXiv e-prints},
@Comment   year            = 2024,
@Comment   eid             = {arXiv:2402.09360},
@Comment   month           = feb,
@Comment   pages           = {arXiv:2402.09360},
@Comment   doi             = {10.48550/arXiv.2402.09360},
@Comment   eprint          = {2402.09360},
@Comment   primaryclass    = {cs.LG},
@Comment   archiveprefix   = {arXiv},
@Comment   timestamp       = {2024-11-14T11:08:04-0500}
@Comment }
  1. M-x helm-bibtex, it shows "Parsing bibliography file ~/ref.bib ..." and hangs.

@mbarton98
Copy link

I'm also having the same issue. I had pinned parsebib to 4.7, but this bibtex-completion update forced parsebib back to 6. I don't use helm, but org-ref has these as dependences. If you need help testing let me know...running Emacs on macos compiled from the master branch today.

@lnguyen4
Copy link

lnguyen4 commented Nov 14, 2024

  1. Hi, I tried my best to troubleshoot and here is my attempt. The hanging still happens with the example.bib containing only entry like this:
@article{shirani-mehr_disentangling_2018,
	title = {Disentangling {Bias} and {Variance} in {Election} {Polls}},
	volume = 113,
	issn = {0162-1459, 1537-274X},
	url = {https://www.tandfonline.com/doi/full/10.1080/01621459.2018.1448823},
	doi = {10.1080/01621459.2018.1448823},
	language = {en},
	number = 522,
	urldate = {2024-11-04},
	journal = {Journal of the American Statistical Association},
	author = {Shirani-Mehr, Houshmand and Rothschild, David and Goel, Sharad and Gelman, Andrew},
	month = apr,
	year = 2018,
	pages = {607--614},
}
  1. Create the example.bib file above in the current home directory.
  2. Run emacs -Q on console.
  3. On scratch buffer, copy this
(require 'package)
(setq package-load-list
      '((wfnames t)
	(async t)
	(helm-core t)
	(helm t)
	(biblio-core t)
	(biblio t)
	(f t)
	(dash t)
	(s t)
	(parsebib t)
	(bibtex-completion t)
	(helm-bibtex t)))
(package-initialize)

(setq bibtex-completion-bibliography "~/example.bib")
  1. Run M-x eval-buffer
  2. Run M-x helm-bibtex.
  3. And the minibuffer hangs with Parsing bibliography file ~/example.bib

My emacs version is GNU Emacs 29.4 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.43, cairo version 1.18.2). Thanks.

@joostkremers
Copy link
Contributor Author

Well, the problem is not with parsebib directly, because all of the sample .bib files I've received parse just fine on their own or when I open them in Ebib. I'll have to try and install bibtex-completion and see if I can replicate the problem.

joostkremers pushed a commit to joostkremers/helm-bibtex that referenced this issue Nov 14, 2024
In parsebib.el 4.7 / 5.0, the function parsebib-find-next-item leaves point
after the @-sign when it finds an item. In parsebib.el 6.0, it leaves
point *before* the @-sign. Therefore, the caller must advance point if the
item is not read, otherwise parsebib-find-next-item will keep finding the
same item.

This fixes the problems reported in tmalsburg#452 and
jkitchin/scimax#510.
@joostkremers
Copy link
Contributor Author

I found the cause of the problem and created a PR to fix it. bibtex-completion uses the function parsebib-find-next-item to find the next BibTeX item after point, but it does not always read the item found. Previously, parsebib-find-next-item would position point right after the @ sign that starts an entry, so this wasn't an issue. In the new parsebib version, parsebib-find-next-item puts point at the start of the line, i.e., before the @ sign. As a result, if the item isn't read, the next call to parsebib-find-next-item finds the exact same item again.

I hope @tmalsburg can merge this PR soon, and I sincerely hope I didn't overlook anything else...

@mbarton98
Copy link

@joostkremers FYI, I just applied your PR to my instance of bibtex-completion and verified it works in my case. Thanks!

@lnguyen4
Copy link

I found the cause of the problem and created a PR to fix it. bibtex-completion uses the function parsebib-find-next-item to find the next BibTeX item after point, but it does not always read the item found. Previously, parsebib-find-next-item would position point right after the @ sign that starts an entry, so this wasn't an issue. In the new parsebib version, parsebib-find-next-item puts point at the start of the line, i.e., before the @ sign. As a result, if the item isn't read, the next call to parsebib-find-next-item finds the exact same item again.

I hope @tmalsburg can merge this PR soon, and I sincerely hope I didn't overlook anything else...

I downloaded your PR and rename the original installed file to bibtex-completion-backup.el. With my minimal example above, I can confirm hanging no longer happens. However, when I tried to open the url link or open the pdf, by first hiting TAB and then select the first or second option, it has error saying : parsebib--char: [Parsebib error]: "Expected [@], got 't' at position 2,8" .

@joostkremers
Copy link
Contributor Author

However, when I tried to open the url link or open the pdf, by first hiting TAB and then select the first or second option, it has error saying : parsebib--char: [Parsebib error]: "Expected [@], got 't' at position 2,8" .

Hmm, that's a bit harder for me to debug, because I don't use helm. Position (2,8) would be the first t of the title field, but at this point parsebib shouldn't be looking for a new entry. Could you do M-x toggle-debug-on-entry and then perform the procedure you just described? You should get a *Backtrace* buffer: it would be helpful if you could post the contents of it here.

@tmalsburg
Copy link
Owner

#454 is merged. Thank you!

@joostkremers
Copy link
Contributor Author

#454 is merged. Thank you!

Don't thank me yet... There's still a bug that needs to be squashed. 😞

@lnguyen4
Copy link

However, when I tried to open the url link or open the pdf, by first hiting TAB and then select the first or second option, it has error saying : parsebib--char: [Parsebib error]: "Expected [@], got 't' at position 2,8" .

Hmm, that's a bit harder for me to debug, because I don't use helm. Position (2,8) would be the first t of the title field, but at this point parsebib shouldn't be looking for a new entry. Could you do M-x toggle-debug-on-entry and then perform the procedure you just described? You should get a *Backtrace* buffer: it would be helpful if you could post the contents of it here.

Thanks for helping so far. Here is the backtrace with the minimal example.bib above.

Debugger entered--Lisp error: (parsebib-error "Expected [@], got `t' at position 2,8")
  signal(parsebib-error ("Expected [@], got `t' at position 2,8"))
  parsebib--char("@")
  parsebib--@entry()
  parsebib-read-entry(nil #<hash-table equal 0/65 0x16e75554dc35>)
  (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf)
  (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf))
  (let ((entry-type (match-string 1))) (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf)))
  (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" (regexp-quote entry-key) "[[:space:]]*,") nil t) (let ((entry-type (match-string 1))) (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf))) (progn (display-warning :warning (concat "Bibtex-completion couldn't find entry with key \"" entry-key "\".")) nil))
  (progn (mapc #'insert-file-contents bib) (goto-char (point-min)) (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" (regexp-quote entry-key) "[[:space:]]*,") nil t) (let ((entry-type (match-string 1))) (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf))) (progn (display-warning :warning (concat "Bibtex-completion couldn't find entry with key \"" entry-key "\".")) nil)))
  (unwind-protect (progn (mapc #'insert-file-contents bib) (goto-char (point-min)) (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" (regexp-quote entry-key) "[[:space:]]*,") nil t) (let ((entry-type (match-string 1))) (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf))) (progn (display-warning :warning (concat "Bibtex-completion couldn't find entry with key \"" entry-key "\".")) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))
  (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (mapc #'insert-file-contents bib) (goto-char (point-min)) (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" (regexp-quote entry-key) "[[:space:]]*,") nil t) (let ((entry-type (match-string 1))) (reverse (bibtex-completion-prepare-entry (parsebib-read-entry nil bibtex-completion-string-hash-table) nil do-not-find-pdf))) (progn (display-warning :warning (concat "Bibtex-completion couldn't find entry with key \"" entry-key "\".")) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
  (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (mapc #'insert-file-contents bib) (goto-char (point-min)) (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" (regexp-quote entry-key) "[[:space:]]*,") nil t) (let ((entry-type ...)) (reverse (bibtex-completion-prepare-entry ... nil do-not-find-pdf))) (progn (display-warning :warning (concat "Bibtex-completion couldn't find entry with key \"" entry-key "\".")) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))))
  (let ((bib (bibtex-completion-normalize-bibliography 'bibtex))) (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (mapc #'insert-file-contents bib) (goto-char (point-min)) (if (re-search-forward (concat "^[ \11]*@\\(" parsebib--bibtex-identifier "\\)[[:space:]]*[({][[:space:]]*" ... "[[:space:]]*,") nil t) (let (...) (reverse ...)) (progn (display-warning :warning ...) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))))
  bibtex-completion-get-entry1("shirani-mehr_disentangling_2018")
  (let* ((entry (bibtex-completion-get-entry1 entry-key)) (crossref (bibtex-completion-get-value "crossref" entry)) (crossref (if crossref (progn (bibtex-completion-get-entry1 crossref))))) (bibtex-completion-remove-duplicated-fields (append entry crossref)))
  bibtex-completion-get-entry("shirani-mehr_disentangling_2018")
  (let* ((entry (bibtex-completion-get-entry key)) (url (bibtex-completion-get-value "url" entry)) (doi (bibtex-completion-get-value "doi" entry)) (browse-url-browser-function (or bibtex-completion-browser-function browse-url-browser-function))) (if url (browse-url url) (if doi (browse-url (s-concat "http://dx.doi.org/" doi)) (message "No URL or DOI found for this entry: %s" key))))
  (let ((key (car tail))) (let* ((entry (bibtex-completion-get-entry key)) (url (bibtex-completion-get-value "url" entry)) (doi (bibtex-completion-get-value "doi" entry)) (browse-url-browser-function (or bibtex-completion-browser-function browse-url-browser-function))) (if url (browse-url url) (if doi (browse-url (s-concat "http://dx.doi.org/" doi)) (message "No URL or DOI found for this entry: %s" key)))) (setq tail (cdr tail)))
  (while tail (let ((key (car tail))) (let* ((entry (bibtex-completion-get-entry key)) (url (bibtex-completion-get-value "url" entry)) (doi (bibtex-completion-get-value "doi" entry)) (browse-url-browser-function (or bibtex-completion-browser-function browse-url-browser-function))) (if url (browse-url url) (if doi (browse-url (s-concat "http://dx.doi.org/" doi)) (message "No URL or DOI found for this entry: %s" key)))) (setq tail (cdr tail))))
  (let ((tail keys)) (while tail (let ((key (car tail))) (let* ((entry (bibtex-completion-get-entry key)) (url (bibtex-completion-get-value "url" entry)) (doi (bibtex-completion-get-value "doi" entry)) (browse-url-browser-function (or bibtex-completion-browser-function browse-url-browser-function))) (if url (browse-url url) (if doi (browse-url (s-concat "http://dx.doi.org/" doi)) (message "No URL or DOI found for this entry: %s" key)))) (setq tail (cdr tail)))))
  bibtex-completion-open-url-or-doi(("shirani-mehr_disentangling_2018"))
  helm-bibtex-open-url-or-doi("shirani-mehr_disentangling_2018")
  helm-execute-selection-action-1()
  helm-execute-selection-action()
  helm-internal((((name . "BibTeX entries") (header-name . #f(compiled-function (name) #<bytecode -0x1907ec257ba66acf>)) (candidates . helm-bibtex-candidates) (keymap keymap (f12 . #f(compiled-function () ... #<bytecode 0x1980dfe4ea0e80>)) (f11 . #f(compiled-function () ... #<bytecode 0x1980dfe4e87e80>)) (f10 . #f(compiled-function () ... #<bytecode 0x1980dfe4e96e80>)) (f9 . #f(compiled-function () ... #<bytecode 0x1980dfe4ef5e80>)) (f8 . #f(compiled-function () ... #<bytecode 0x1980dfe4ee4e80>)) (f7 . #f(compiled-function () ... #<bytecode 0x1980dff5eebe80>)) (f6 . #f(compiled-function () ... #<bytecode 0x1980dff5efae80>)) (f5 . #f(compiled-function () ... #<bytecode 0x1980dff5e99e80>)) (f4 . #f(compiled-function () ... #<bytecode 0x1980dff5e88e80>)) (f3 . #f(compiled-function () ... #<bytecode 0x1980dff5eafe80>)) (f2 . #f(compiled-function () ... #<bytecode 0x1980dff5ebee80>)) (menu-bar keymap (help-menu keymap ...)) (help keymap (109 . helm-help)) (23 . helm-helm-yank-text-at-point-with-subkeys) (f1 . #f(compiled-function () ... #<bytecode 0x1980dff5e7de80>)) (8 keymap (109 . helm-help) (104 . undefined) (8 . undefined) (100 . helm-debug-output) (99 . helm-customize-group) (4 . helm-enable-or-switch-to-debug)) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (26 . helm-toggle-full-frame) (3 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd706de3c3175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd706dfa13175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd706dfba3175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd706dfef3175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd706df983175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd706dfcd3175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd706dfd63175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd706dffb3175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd706dff43175>)) (110 . helm-helm-run-cycle-resume-with-subkeys) (108 . helm-display-line-numbers-mode) (62 . helm-toggle-truncate-line) (21 . helm-refresh) (6 . helm-follow-mode) (9 . helm-insert-or-copy) (11 . helm-kill-selection-and-quit) (25 . helm-yank-selection) (37 . helm-exchange-minibuffer-and-header-line) (95 . helm-toggle-full-frame) (45 . helm-swap-windows)) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (18 . undefined) (19 . undefined) (24 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd8ac17c87175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd8ac17f17175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd8ac17d67175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd8ac27f77175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd8ac27ec7175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd8ac27d57175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd8ac27da7175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bcb7175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bd07175>)) (2 . helm-resume-list-buffers-after-quit) (98 . helm-resume-previous-session-after-quit) (6 . helm-quit-and-find-file)) (127 . helm-delete-char-backward) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) (C-M-up . helm-scroll-other-window-down) (C-M-down . helm-scroll-other-window) (M-prior . helm-scroll-other-window-down) (M-next . helm-scroll-other-window) (12 . helm-recenter-top-bottom-other-window) (left . helm-previous-source) ...) (action ("Open PDF, URL or DOI" . helm-bibtex-open-any) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) ("Insert citation" . helm-bibtex-insert-citation) ("Insert reference" . helm-bibtex-insert-reference) ("Insert BibTeX key" . helm-bibtex-insert-key) ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) ("Show entry" . helm-bibtex-show-entry) ("Add PDF to library" . helm-bibtex-add-pdf-to-library)) (requires-pattern . 0) (filtered-candidate-transformer helm-bibtex-candidates-formatter helm-fuzzy-highlight-matches) (match helm-mm-exact-match helm-mm-match) (redisplay . identity) (header-line . #("C-j: Open PDF, URL or DOI (keeping ses..." 0 3 (font-lock-face help-key-binding face help-key-binding))) (multimatch . t) (group . helm)) ((name . "Fallback options") (match (lambda (_candidate) t)) (candidates . bibtex-completion-fallback-candidates) (no-matchplugin) (nohighlight) (action lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern)))) nil nil nil #f(compiled-function () #<bytecode 0x8014e588637eac3>) "*helm bibtex*" nil nil nil)
  apply(helm-internal ((((name . "BibTeX entries") (header-name . #f(compiled-function (name) #<bytecode -0x1907ec257ba66acf>)) (candidates . helm-bibtex-candidates) (keymap keymap (f12 . #f(compiled-function () ... #<bytecode 0x1980dfe4ea0e80>)) (f11 . #f(compiled-function () ... #<bytecode 0x1980dfe4e87e80>)) (f10 . #f(compiled-function () ... #<bytecode 0x1980dfe4e96e80>)) (f9 . #f(compiled-function () ... #<bytecode 0x1980dfe4ef5e80>)) (f8 . #f(compiled-function () ... #<bytecode 0x1980dfe4ee4e80>)) (f7 . #f(compiled-function () ... #<bytecode 0x1980dff5eebe80>)) (f6 . #f(compiled-function () ... #<bytecode 0x1980dff5efae80>)) (f5 . #f(compiled-function () ... #<bytecode 0x1980dff5e99e80>)) (f4 . #f(compiled-function () ... #<bytecode 0x1980dff5e88e80>)) (f3 . #f(compiled-function () ... #<bytecode 0x1980dff5eafe80>)) (f2 . #f(compiled-function () ... #<bytecode 0x1980dff5ebee80>)) (menu-bar keymap (help-menu keymap ...)) (help keymap (109 . helm-help)) (23 . helm-helm-yank-text-at-point-with-subkeys) (f1 . #f(compiled-function () ... #<bytecode 0x1980dff5e7de80>)) (8 keymap (109 . helm-help) (104 . undefined) (8 . undefined) (100 . helm-debug-output) (99 . helm-customize-group) (4 . helm-enable-or-switch-to-debug)) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (26 . helm-toggle-full-frame) (3 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd706de3c3175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd706dfa13175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd706dfba3175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd706dfef3175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd706df983175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd706dfcd3175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd706dfd63175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd706dffb3175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd706dff43175>)) (110 . helm-helm-run-cycle-resume-with-subkeys) (108 . helm-display-line-numbers-mode) (62 . helm-toggle-truncate-line) (21 . helm-refresh) (6 . helm-follow-mode) (9 . helm-insert-or-copy) (11 . helm-kill-selection-and-quit) (25 . helm-yank-selection) (37 . helm-exchange-minibuffer-and-header-line) (95 . helm-toggle-full-frame) (45 . helm-swap-windows)) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (18 . undefined) (19 . undefined) (24 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd8ac17c87175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd8ac17f17175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd8ac17d67175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd8ac27f77175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd8ac27ec7175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd8ac27d57175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd8ac27da7175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bcb7175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bd07175>)) (2 . helm-resume-list-buffers-after-quit) (98 . helm-resume-previous-session-after-quit) (6 . helm-quit-and-find-file)) (127 . helm-delete-char-backward) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) (C-M-up . helm-scroll-other-window-down) (C-M-down . helm-scroll-other-window) (M-prior . helm-scroll-other-window-down) (M-next . helm-scroll-other-window) (12 . helm-recenter-top-bottom-other-window) (left . helm-previous-source) (right . helm-next-source) (15 . helm-next-source) (10 . helm-execute-persistent-action) (9 . helm-select-action) (13 . helm-maybe-exit-minibuffer) (7 . helm-keyboard-quit) ...) (action ("Open PDF, URL or DOI" . helm-bibtex-open-any) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) ("Insert citation" . helm-bibtex-insert-citation) ("Insert reference" . helm-bibtex-insert-reference) ("Insert BibTeX key" . helm-bibtex-insert-key) ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) ("Show entry" . helm-bibtex-show-entry) ("Add PDF to library" . helm-bibtex-add-pdf-to-library)) (requires-pattern . 0) (filtered-candidate-transformer helm-bibtex-candidates-formatter helm-fuzzy-highlight-matches) (match helm-mm-exact-match helm-mm-match) (redisplay . identity) (header-line . #("C-j: Open PDF, URL or DOI (keeping session)" 0 3 (font-lock-face help-key-binding face help-key-binding))) (multimatch . t) (group . helm)) ((name . "Fallback options") (match (lambda (_candidate) t)) (candidates . bibtex-completion-fallback-candidates) (no-matchplugin) (nohighlight) (action lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern)))) nil nil nil #f(compiled-function () #<bytecode 0x8014e588637eac3>) "*helm bibtex*" nil nil nil))
  helm((((name . "BibTeX entries") (header-name . #f(compiled-function (name) #<bytecode -0x1907ec257ba66acf>)) (candidates . helm-bibtex-candidates) (keymap keymap (f12 . #f(compiled-function () ... #<bytecode 0x1980dfe4ea0e80>)) (f11 . #f(compiled-function () ... #<bytecode 0x1980dfe4e87e80>)) (f10 . #f(compiled-function () ... #<bytecode 0x1980dfe4e96e80>)) (f9 . #f(compiled-function () ... #<bytecode 0x1980dfe4ef5e80>)) (f8 . #f(compiled-function () ... #<bytecode 0x1980dfe4ee4e80>)) (f7 . #f(compiled-function () ... #<bytecode 0x1980dff5eebe80>)) (f6 . #f(compiled-function () ... #<bytecode 0x1980dff5efae80>)) (f5 . #f(compiled-function () ... #<bytecode 0x1980dff5e99e80>)) (f4 . #f(compiled-function () ... #<bytecode 0x1980dff5e88e80>)) (f3 . #f(compiled-function () ... #<bytecode 0x1980dff5eafe80>)) (f2 . #f(compiled-function () ... #<bytecode 0x1980dff5ebee80>)) (menu-bar keymap (help-menu keymap ...)) (help keymap (109 . helm-help)) (23 . helm-helm-yank-text-at-point-with-subkeys) (f1 . #f(compiled-function () ... #<bytecode 0x1980dff5e7de80>)) (8 keymap (109 . helm-help) (104 . undefined) (8 . undefined) (100 . helm-debug-output) (99 . helm-customize-group) (4 . helm-enable-or-switch-to-debug)) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (26 . helm-toggle-full-frame) (3 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd706de3c3175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd706dfa13175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd706dfba3175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd706dfef3175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd706df983175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd706dfcd3175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd706dfd63175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd706dffb3175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd706dff43175>)) (110 . helm-helm-run-cycle-resume-with-subkeys) (108 . helm-display-line-numbers-mode) (62 . helm-toggle-truncate-line) (21 . helm-refresh) (6 . helm-follow-mode) (9 . helm-insert-or-copy) (11 . helm-kill-selection-and-quit) (25 . helm-yank-selection) (37 . helm-exchange-minibuffer-and-header-line) (95 . helm-toggle-full-frame) (45 . helm-swap-windows)) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (18 . undefined) (19 . undefined) (24 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd8ac17c87175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd8ac17f17175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd8ac17d67175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd8ac27f77175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd8ac27ec7175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd8ac27d57175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd8ac27da7175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bcb7175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bd07175>)) (2 . helm-resume-list-buffers-after-quit) (98 . helm-resume-previous-session-after-quit) (6 . helm-quit-and-find-file)) (127 . helm-delete-char-backward) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) (C-M-up . helm-scroll-other-window-down) (C-M-down . helm-scroll-other-window) (M-prior . helm-scroll-other-window-down) (M-next . helm-scroll-other-window) (12 . helm-recenter-top-bottom-other-window) (left . helm-previous-source) ...) (action ("Open PDF, URL or DOI" . helm-bibtex-open-any) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) ("Insert citation" . helm-bibtex-insert-citation) ("Insert reference" . helm-bibtex-insert-reference) ("Insert BibTeX key" . helm-bibtex-insert-key) ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) ("Show entry" . helm-bibtex-show-entry) ("Add PDF to library" . helm-bibtex-add-pdf-to-library)) (requires-pattern . 0) (filtered-candidate-transformer helm-bibtex-candidates-formatter helm-fuzzy-highlight-matches) (match helm-mm-exact-match helm-mm-match) (redisplay . identity) (header-line . #("C-j: Open PDF, URL or DOI (keeping ses..." 0 3 (font-lock-face help-key-binding face help-key-binding))) (multimatch . t) (group . helm)) ((name . "Fallback options") (match (lambda (_candidate) t)) (candidates . bibtex-completion-fallback-candidates) (no-matchplugin) (nohighlight) (action lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern)))) nil nil nil #f(compiled-function () #<bytecode 0x8014e588637eac3>) "*helm bibtex*" nil nil nil)
  apply(helm ((((name . "BibTeX entries") (header-name . #f(compiled-function (name) #<bytecode -0x1907ec257ba66acf>)) (candidates . helm-bibtex-candidates) (keymap keymap (f12 . #f(compiled-function () ... #<bytecode 0x1980dfe4ea0e80>)) (f11 . #f(compiled-function () ... #<bytecode 0x1980dfe4e87e80>)) (f10 . #f(compiled-function () ... #<bytecode 0x1980dfe4e96e80>)) (f9 . #f(compiled-function () ... #<bytecode 0x1980dfe4ef5e80>)) (f8 . #f(compiled-function () ... #<bytecode 0x1980dfe4ee4e80>)) (f7 . #f(compiled-function () ... #<bytecode 0x1980dff5eebe80>)) (f6 . #f(compiled-function () ... #<bytecode 0x1980dff5efae80>)) (f5 . #f(compiled-function () ... #<bytecode 0x1980dff5e99e80>)) (f4 . #f(compiled-function () ... #<bytecode 0x1980dff5e88e80>)) (f3 . #f(compiled-function () ... #<bytecode 0x1980dff5eafe80>)) (f2 . #f(compiled-function () ... #<bytecode 0x1980dff5ebee80>)) (menu-bar keymap (help-menu keymap ...)) (help keymap (109 . helm-help)) (23 . helm-helm-yank-text-at-point-with-subkeys) (f1 . #f(compiled-function () ... #<bytecode 0x1980dff5e7de80>)) (8 keymap (109 . helm-help) (104 . undefined) (8 . undefined) (100 . helm-debug-output) (99 . helm-customize-group) (4 . helm-enable-or-switch-to-debug)) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (26 . helm-toggle-full-frame) (3 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd706de3c3175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd706dfa13175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd706dfba3175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd706dfef3175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd706df983175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd706dfcd3175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd706dfd63175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd706dffb3175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd706dff43175>)) (110 . helm-helm-run-cycle-resume-with-subkeys) (108 . helm-display-line-numbers-mode) (62 . helm-toggle-truncate-line) (21 . helm-refresh) (6 . helm-follow-mode) (9 . helm-insert-or-copy) (11 . helm-kill-selection-and-quit) (25 . helm-yank-selection) (37 . helm-exchange-minibuffer-and-header-line) (95 . helm-toggle-full-frame) (45 . helm-swap-windows)) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (18 . undefined) (19 . undefined) (24 keymap (57 . #f(compiled-function () ... #<bytecode -0x47bd8ac17c87175>)) (56 . #f(compiled-function () ... #<bytecode -0x47bd8ac17f17175>)) (55 . #f(compiled-function () ... #<bytecode -0x47bd8ac17d67175>)) (54 . #f(compiled-function () ... #<bytecode -0x47bd8ac27f77175>)) (53 . #f(compiled-function () ... #<bytecode -0x47bd8ac27ec7175>)) (52 . #f(compiled-function () ... #<bytecode -0x47bd8ac27d57175>)) (51 . #f(compiled-function () ... #<bytecode -0x47bd8ac27da7175>)) (50 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bcb7175>)) (49 . #f(compiled-function () ... #<bytecode -0x47bd8ac1bd07175>)) (2 . helm-resume-list-buffers-after-quit) (98 . helm-resume-previous-session-after-quit) (6 . helm-quit-and-find-file)) (127 . helm-delete-char-backward) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) (C-M-up . helm-scroll-other-window-down) (C-M-down . helm-scroll-other-window) (M-prior . helm-scroll-other-window-down) (M-next . helm-scroll-other-window) (12 . helm-recenter-top-bottom-other-window) (left . helm-previous-source) (right . helm-next-source) (15 . helm-next-source) (10 . helm-execute-persistent-action) (9 . helm-select-action) (13 . helm-maybe-exit-minibuffer) (7 . helm-keyboard-quit) ...) (action ("Open PDF, URL or DOI" . helm-bibtex-open-any) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) ("Insert citation" . helm-bibtex-insert-citation) ("Insert reference" . helm-bibtex-insert-reference) ("Insert BibTeX key" . helm-bibtex-insert-key) ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) ("Show entry" . helm-bibtex-show-entry) ("Add PDF to library" . helm-bibtex-add-pdf-to-library)) (requires-pattern . 0) (filtered-candidate-transformer helm-bibtex-candidates-formatter helm-fuzzy-highlight-matches) (match helm-mm-exact-match helm-mm-match) (redisplay . identity) (header-line . #("C-j: Open PDF, URL or DOI (keeping session)" 0 3 (font-lock-face help-key-binding face help-key-binding))) (multimatch . t) (group . helm)) ((name . "Fallback options") (match (lambda (_candidate) t)) (candidates . bibtex-completion-fallback-candidates) (no-matchplugin) (nohighlight) (action lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern)))) nil nil nil #f(compiled-function () #<bytecode 0x8014e588637eac3>) "*helm bibtex*" nil nil nil))
  helm(:sources (((name . "BibTeX entries") (header-name . #f(compiled-function (name) #<bytecode -0x1907ec257ba66acf>)) (candidates . helm-bibtex-candidates) (keymap keymap (f12 . #f(compiled-function () ... #<bytecode 0x1980dfe4ea0e80>)) (f11 . #f(compiled-function () ... #<bytecode 0x1980dfe4e87e80>)) (f10 . #f(compiled-function () ... #<bytecode 0x1980dfe4e96e80>)) (f9 . #f(compiled-function () ... #<bytecode 0x1980dfe4ef5e80>)) (f8 . #f(compiled-function () ... #<bytecode 0x1980dfe4ee4e80>)) (f7 . #f(compiled-function () ... #<bytecode 0x1980dff5eebe80>)) (f6 . #f(compiled-function () ... #<bytecode 0x1980dff5efae80>)) (f5 . #f(compiled-function () ... #<bytecode 0x1980dff5e99e80>)) (f4 . #f(compiled-function () ... #<bytecode 0x1980dff5e88e80>)) (f3 . #f(compiled-function () ... #<bytecode 0x1980dff5eafe80>)) (f2 . #f(compiled-function () ... #<bytecode 0x1980dff5ebee80>)) (menu-bar keymap ...) (help keymap ...) (23 . helm-helm-yank-text-at-point-with-subkeys) (f1 . #f(compiled-function () ... #<bytecode 0x1980dff5e7de80>)) (8 keymap ... ... ... ... ... ...) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (26 . helm-toggle-full-frame) (3 keymap ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (18 . undefined) (19 . undefined) (24 keymap ... ... ... ... ... ... ... ... ... ... ... ...) (127 . helm-delete-char-backward) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) ...) (action ("Open PDF, URL or DOI" . helm-bibtex-open-any) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) ("Insert citation" . helm-bibtex-insert-citation) ("Insert reference" . helm-bibtex-insert-reference) ("Insert BibTeX key" . helm-bibtex-insert-key) ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) ("Show entry" . helm-bibtex-show-entry) ("Add PDF to library" . helm-bibtex-add-pdf-to-library)) (requires-pattern . 0) (filtered-candidate-transformer helm-bibtex-candidates-formatter helm-fuzzy-highlight-matches) (match helm-mm-exact-match helm-mm-match) (redisplay . identity) (header-line . #("C-j: Open PDF, URL or DOI (keepi..." 0 3 ...)) (multimatch . t) (group . helm)) ((name . "Fallback options") (match (lambda ... t)) (candidates . bibtex-completion-fallback-candidates) (no-matchplugin) (nohighlight) (action lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern)))) :full-frame t :buffer "*helm bibtex*" :input nil :preselect #f(compiled-function () #<bytecode 0x8014e588637eac3>) :candidate-number-limit 500 :bibtex-candidates (("shirani-mehr_disentangling_2018 ..." ("=key=" . "shirani-mehr_disentangling_2018") ("=type=" . "article") ("year" . "2018") ("author" . "Shirani-Mehr, Houshmand and Roth...") ("title" . "Disentangling {Bias} and {Varian..."))) :bibtex-local-bib nil)
  helm-bibtex(nil)
  funcall-interactively(helm-bibtex nil)
  call-interactively(helm-bibtex record nil)
  command-execute(helm-bibtex record)
  execute-extended-command(nil "helm-bibtex" nil)
  funcall-interactively(execute-extended-command nil "helm-bibtex" nil)
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

@gongzhitaao
Copy link

It worked for me.

@lnguyen4
Copy link

It worked for me.

Would you mind giving the versions of the packages you have on your system? There may be obsolete dependency packages on my end. I usually use melpa repos. What is your emacs version? thanks

@joostkremers
Copy link
Contributor Author

joostkremers commented Nov 15, 2024

Thanks @lnguyen4 , that was very helpful. I indeed found another bug that was introduced by the new parsebib version but had to be fixed in bibtex-completion. I created another PR.

The reason for these bugs is that bibtex-completion uses parsebib's low-level API, which I made change to because I thought my own package Ebib was the only package using it... The low-level API depends on the buffer position of point, and I made some changes to where the various functions expect point to be. This obviously backfired...

I checked the places where bibtex-completion uses parsebib, and I think things are now correct. I just hope that I haven't overlooked something else...

My apologies for all the hassle this is causing and my thanks to all of you for your patience!

@gongzhitaao
Copy link

  • emacs: GNU Emacs 29.4 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.41, cairo version 1.18.0) of 2024-06-27, modified by Debian
  • parsebib: 6.0
  • bibtex-completion: 1.0.0
  • helm-bibtex: 2.0.1

@lnguyen4
Copy link

Thanks @lnguyen4 , that was very helpful. I indeed found another bug that was introduced by the new parsebib version but had to be fixed in bibtex-completion. I created another PR.

The reason for these bugs is that bibtex-completion uses parsebib's low-level API, which I made change to because I thought my own package Ebib was the only package using it... The low-level API depends on the buffer position of point, and I made some changes to where the various functions expect point to be. This obviously backfired...

I checked the places where bibtex-completion uses parsebib, and I think things are now correct. I just hope that I haven't overlooked something else...

My apologies for all the hassle this is causing and my thanks to all of you for your patience!

No problem. Emacs rules! :). And I updated the el file from your PR. It works like usual now. I can select all the actions on the entry and no error happens. Thanks a lot.

@lnguyen4
Copy link

  • emacs: GNU Emacs 29.4 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.41, cairo version 1.18.0) of 2024-06-27, modified by Debian

    • parsebib: 6.0

    • bibtex-completion: 1.0.0

    • helm-bibtex: 2.0.1

I see. My bibtex-completion is pretty recent.

bibtex-completion-20241115.847
helm-bibtex-20231009.1014
parsebib-20241112.2030
helm-20241112.620
helm-bibtex-20231009.1014
helm-core-20241109.438

@gongzhitaao
Copy link

gongzhitaao commented Nov 15, 2024

helm-bibtex-20231009.1014

I suspect that this is from melpa and does not catch the most recent change on https://github.com/tmalsburg/helm-bibtex which is updated <1d ago I used straight to download from the github daily.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants