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

Fix for issue with initial-input in org-ql-view--complete-buffers-files (Fix #227) #228

Closed
wants to merge 15 commits into from

Conversation

ahmed-shariff
Copy link

@ahmed-shariff ahmed-shariff commented Jun 30, 2021

Fix #227

@alphapapa
Copy link
Owner

Which values have you tested this with?

@ahmed-shariff
Copy link
Author

ahmed-shariff commented Jul 1, 2021

For me the issues was when using the prefix argument for refreshing while in the org-ql-view/agenda buffer. I've tested this with different org file and queries and with selectrum and the vanilla completing-read. Is that what you were looking for? I am not familiar with writing tests on elisp.

@ahmed-shariff
Copy link
Author

An alternative is to use the DEF option of completing-read:

(defun org-ql-view--complete-buffers-files ()
  "Return value for `org-ql-view-buffers-files' using completion."
  (cl-labels ((initial-input
               () (when org-ql-view-buffers-files
                    (org-ql-view--contract-buffers-files
                     org-ql-view-buffers-files))))
    (if (and org-ql-view-buffers-files
             (bufferp org-ql-view-buffers-files))
        ;; Buffers can't be input by name, so if the default value is a buffer, just use it.
        ;; TODO: Find a way to fix this.
        org-ql-view-buffers-files
      (org-ql-view--expand-buffers-files
       (completing-read "Buffers/Files: "
                        (list 'buffer 'org-agenda-files 'org-directory 'all)
                        ;; nil nil (initial-input))))))
                        nil nil nil nil (initial-input)))))) ;; (initial-input) is passed to DEF

@alphapapa
Copy link
Owner

What I mean is, this is a matter of converting values to and from readable representations--it's a two-way conversion. The variable in question may have a few different forms as its value, and each possible form must be printed and read again from the user's input. You seem to be reporting a problem with one of those forms and trying to fix it for that form. What about the other forms?

Using a different argument to completing-read is a different solution that brings its own issues. I would prefer that users not have to take the extra step of M-n to get the value again.

Handles the different values `org-ql-view-buffers-files` can hold.
Use completing-read only if `org-ql-view-buffers-files` is nil or the
contracted form of `org-ql-view-buffers-files` is a string.
@ahmed-shariff
Copy link
Author

I agree with your second point, that might not be ideal.

As for the different conditions, it seems I've misunderstood what how the function in question works. :)

Am I correct in assuming the org-ql-view--complete-buffers-filess behaviour is as follows:

  • if the contracted form of org-ql-view-buffers-files is a string or org-ql-view-buffers-files is nil -> prompt for input using completing-read
    • This would include the cases where the org-ql-view-buffers-files value corresponds to "buffer", "org-agenda-files", "org-directory", "org-agenda-files" and when it is nil
  • if the org-ql-view-buffers-files is a buffer, simply return the buffer.
  • if the org-ql-view-buffers-files is a list: this is the part that is causing the problem. I am not clear on how this value is expected to be handled? do you want to check if it is only one value, if so set it up with completing-read? or would it be better to simply return org-ql-view-buffers-files if the contracted form is not a string or org-ql-view-buffers-files is not nil?

Also is there a particular reason to wrap the initial-input form in a label?

I've pushed a version of org-ql-view--complete-buffers-files promts only contracted form of org-ql-view-buffers-files is a string or org-ql-view-buffers-files is nil. Does this make more sense?

@ahmed-shariff
Copy link
Author

Also while digging into how the above function works, I came across this - the documentation of org-ql-search states that:

  • A space-separated list of file or buffer names

when using interactively. Is this supported? Testing it doesn't seem to work? I tried the following for "Buffer/files:"

  • "*scratch* *scratch2*"
  • "orgfile1.org orgfile2.org"

@alphapapa
Copy link
Owner

As for the different conditions, it seems I've misunderstood what how the function in question works. :)

The function exists because, e.g. if the user is searching the list of files in the variable org-agenda-files, that list is expanded to the list of files when the search is run. Afterward, if the user wants to modify the search, it would not be very helpful to have a long list of long filenames in the interactive completion, so, e.g. if the list of files is the same as that in org-agenda-files, the list of files is replaced with that variable name (and then converted back to the list of files when the search is run again).

I wasn't aware of any issue with completing-read, and it seems to work for me, so maybe this was caused by a change in Emacs. What version are you using?

Also is there a particular reason to wrap the initial-input form in a label?

cl-labels defines functions in a local scope. Sometimes I use it to organize code more cleanly, like here.

I've pushed a version of org-ql-view--complete-buffers-files promts only contracted form of org-ql-view-buffers-files is a string or org-ql-view-buffers-files is nil. Does this make more sense?

In order to fix this bug without potentially causing any others, I think it's necessary add tests for all of its intended input and output forms. If we don't enumerate and test them, we're likely to overlook some.

when using interactively. Is this supported? Testing it doesn't seem to work? I tried the following for "Buffer/files:"

What happens?

Anyway, try enclosing them in quotes. If that still doesn't work, then it's probably a bug; I never pass buffer names interactively, so it's not something I've tested. (This is an example of why it needs comprehensive tests.)

@ahmed-shariff
Copy link
Author

ahmed-shariff commented Jul 3, 2021

I wasn't aware of any issue with completing-read, and it seems to work for me, so maybe this was caused by a change in Emacs. What version are you using?

I have 4 different version installed across different pc's I use :')
All >= 26

The issue happens with calling org-ql-search programmatically. For example if I eval the following:

(org-ql-search '("~/Documents/orgfile1.org" "~/Documents/orgfile1.org")  query)

The query would run and I can get the view.
But when I try to modify the query using C-u r, that's when the error I reported on the issue happens.

I just started looking into writing test cases in emacs. When I have some time, I'll try to write a few cases to test the expand and contract behaviour for the different conditions as well as for the org-ql-view--complete-buffers-files function.

To sum up, is the behavior of org-ql-view--complete-buffers-files defined as follows correct?

org-ql-view--complete-buffers-files promts only if contracted form of org-ql-view-buffers-files is a string or org-ql-view-buffers-files is nil.

I also opened a new issue for the space-seperated buffers/files issue #230.

@alphapapa
Copy link
Owner

But when I try to modify the query using C-u r, that's when the error I reported on the issue happens.

Does it also happen if you use the Transient dispatcher to modify the buffers/files list? i.e. press v i RET. I suspect it will.

I just started looking into writing test cases in emacs. When I have some time, I'll try to write a few cases to test the expand and contract behaviour for the different conditions as well as for the org-ql-view--complete-buffers-files function.

Ok, thanks. Please see test-org-ql.el, especially the parts that test the return values of certain functions (rather than the parts that test query results).

To sum up, is the behavior of org-ql-view--complete-buffers-files defined as follows correct? org-ql-view--complete-buffers-files promts only if contracted form of org-ql-view-buffers-files is a string or org-ql-view-buffers-files is nil.

No, I don't think that's correct. Please see the function's definition; it's very short.

I think it's important for us to keep in mind that there are multiple functions interacting here: org-ql-view--contract-buffers-files, org-ql-view--complete-buffers-files, and org-ql-view--expand-buffers-files, each with its own distinct purpose. That's why I think that tests are needed for each function before we can consider this issue (or issues) completely fixed.

@ahmed-shariff
Copy link
Author

Does it also happen if you use the Transient dispatcher to modify the buffers/files list? i.e. press v i RET. I suspect it will.

Yep, same behavior.

I had pushed a set of test for the org-ql-view--*-buffers-files functions. I tried to account for their different use cases. But for org-ql-view--complete-buffers-files it assumes the definition I had shared before. Do you have any plans or ideas on how you want to handle the completion for entries that org-ql-view--contract-buffers-files doesn't contract: which are lists of non standard files names or buffer names, or buffers themselves? Would it be linked to implementing the issue in #230 ? The current behaviour on master is to return the value of org-ql-view-buffers-files if it is a buffer object without prompting for completion. I extended the same behaviour for non-standard lists. I am assuming that was a temporary solution?

@alphapapa
Copy link
Owner

alphapapa commented Jul 5, 2021

I'm impressed! You learn and work quickly. You seem to have made good use of Buttercup's features. I haven't read every line of your tests yet, but it looks like you were thorough.

Note that buffers are not readable in Elisp, so the only way they could be completed or read is by name. That leaves some potential ambiguity, as a string could be a filename or a buffer name. A simple heuristic could be to check whether a string matches a buffer name (i.e. just call get-buffer): if it does, use the buffer, otherwise try file-exists-p; and if neither seems valid, signal with user-error.

Also, to be clear, the completion is not intended to actually offer completion of buffer or file names; it's just intended to guide the user in choosing the right kinds of values to this argument. (We could consider enhancing the completion for buffer/file names in the future.)

What do you think?

Thanks very much for your work on this. You've saved me a lot of time. :)

Copy link
Owner

@alphapapa alphapapa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again.

tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
@alphapapa
Copy link
Owner

You may be in the middle of working on this now, but I just happened to see this, and maybe it would be good to let you know now: I understand that factoring out that code into a function helps with testing, but I'd prefer not to do that unless it's really necessary. I don't think we need to do that to test the behavior of these other functions.

@alphapapa
Copy link
Owner

By the way, I've had second thoughts about mocking functions' return values. I think we should generally avoid that, because it could mask problems if those functions change (and sometimes Org functions do). Instead, we can bind the variables that affect those functions' return values. (I'm making this comment here rather than as a review comment in each place in the code; sorry for any confusion.)

@ahmed-shariff
Copy link
Author

ahmed-shariff commented Jul 5, 2021

Anytime man. I enjoy hacking stuff, so :D
As I mentioned before I am new to writing tests as a whole, let alone on emacs. I'll make the changes you've requested and push it when I get some time.

Regarding reading buffers, what you suggest makes sense. Following your suggestion, I have added the following:

  • When the string passed to org-ql-select is not a file name but is a buffer name, return that. Previously, it would throw a user-error saying "can't open the file". I also moved the processing of the buffers-of-files in org-ql-select to a function outside. Just easier to test and also maybe can be used elsewhere if needed.
  • When contracting buffers-or-files from the view, if it is a buffer, return the buffer name instead of the buffer object. This kind of solve the todo you had in org-ql-view--complete-buffers-files.

This still leaves the issue of how to process lists in the view. One potential solution is to define a separator (eg: ";") and allow typing in buffer-names/file-name separated by it. Is there a better way to do that?

@ahmed-shariff
Copy link
Author

Just saw the messages. I have a habit of abstracting whenever possible :)
I understand why you wouldn't want that as a separate function, I can move that back in. And also will make the fixes to the test as you mentioned.

@ahmed-shariff
Copy link
Author

Also, in the last commit, I am dumping the default value of the contracted org-ql-view-buffers-files as the initial-input (even list) and compare the output of completing-read to this value. If it is the same as the initial-input, return the previous value of org-ql-view-buffers-files. But this is a very hacky solution for when org-ql-view-buffers-files is a list. Coz typing something in with a similar syntax won't work.

Fn: org-ql-view--complete-buffers-files
With buffers, org-ql-view--contract-buffers-files return the buffer
name.
When org-ql-view-buffers-files is a list, just dumpt it as a string
and check if completion-read returns the same value, if so return the
original value of org-ql-view-buffers-files
org-ql.el Show resolved Hide resolved
@alphapapa
Copy link
Owner

alphapapa commented Jul 6, 2021

Coz typing something in with a similar syntax won't work.

Please give specific examples so we can talk about this concretely and try to devise a solution. We might need to use read in some cases, but that raises its own issues (i.e. it would require users to quote every string, so we'd have to do that ourselves first, and then things start to get complicated). Whatever we do, our goal here should be to be more explicit about what is supported, in what formats, and disallow inputs not in a valid format.

This still leaves the issue of how to process lists in the view. One potential solution is to define a separator (eg: ";") and allow typing in buffer-names/file-name separated by it. Is there a better way to do that?

I'd prefer not to use separators other than spaces, and filenames with spaces should be quoted.

Maybe we should separate this work into two phases:

  1. Fix the bug you reported with re-running queries and converting between the contracted/expanded form of the buffers-files list.
  2. Redesign the interactive buffers-files input and completion.

We should do phase 1 first so that the next stable release of org-ql can be made without this bug. Then we can consider phase 2 for future improvements.

org-ql-view.el Outdated Show resolved Hide resolved
@ahmed-shariff
Copy link
Author

ahmed-shariff commented Jul 8, 2021

Maybe we should separate this work into two phases

I agree, but I am having a hard time separating these two:

To be clear, as I described before, the problem is when we have org-ql-view-buffers-files having a representation that the org-ql-view--contract-buffers-files doesn't provide a contracted form for, in the current case, these are lists that cannot be defined by agenda-files or org-directory. For instance if org-ql-view-buffers-files is set to ("orgfile1.org" "orgfile2.org) what should the completion look like (for both the initial-input as well as when entering new values)?

I feel like the having the list represented as a space (or any other character (maybe make this a customizable value?)) separated string might be a better idea? What do you think?

On the same note, similar to my above comment, perhaps raise user-error if the input cannot be contracted to an expected value/representation?

@alphapapa
Copy link
Owner

I feel like the having the list represented as a space (or any other character (maybe make this a customizable value?)) separated string might be a better idea? What do you think?

Filenames may contain spaces, so we have two choices: 1) quote every filename, which would be more tedious for the user; 2) only quote filenames with spaces, which would probably require either some kind of fancy parsing or calling read and converting unquoted filenames from symbols to strings. Neither is ideal, but having to quote every filename, even ones without spaces, would be a poor UI, I think.

On the same note, similar to my above comment, perhaps raise user-error if the input cannot be contracted to an expected value/representation?

I think that would be confusing for the user: a query could work when calling org-ql-search but then signal an error when the user tries to edit the buffers-files variable. I can imagine the bug reports...

Anyway, I think I'll plan for this issue/PR to be addressed/merged in 0.7, that way it won't hold up 0.6, which has had this issue for a while already without many users noticing.

@alphapapa alphapapa added the bug label Jul 8, 2021
@alphapapa
Copy link
Owner

I think that would be confusing for the user: a query could work when calling org-ql-search but then signal an error when the user tries to edit the buffers-files variable. I can imagine the bug reports...

Should these two be consolidated?

I'm not sure what you mean.

Regarding the multiple entries completion, here are a few other ideas:

* Using completing-read-multiple

* Have another default option the in completion list (eg: `enter custom values`) that leads to another read function like `read` or `completing-read-multiple`

Previously I kind of had issues with the completing-read-multiple, but since I moved to using selectrum, it's kind of grown on me. And I think it'd be a simpler (and cleaner?) solution and also allows to combine the default options as well (eg: buffer and org-agenda-files)

I haven't used completing-read-multiple much, so I don't know how well I like it. But I think it's worth testing, yes.

@ahmed-shariff
Copy link
Author

I'm not sure what you mean.

I meant the validation of the input. In retrospect, I think it might not be needed at all, as the values are processed by org-ql-select anyways.

I'll push a version that uses completing-read-multiple

@ahmed-shariff
Copy link
Author

ahmed-shariff commented Jul 19, 2021

@alphapapa would you be able to try the latest commit on this PR and see how the UI feels?

It uses the completing-read-multiple interface. By default the separator is ",", but it can be modified if needed by modifying crm-separator.
You should be able to use the values previously specified (buffer org-agenda-files org-directory all) and also any other buffer or file names.
For example, with the default separator the following is a valid value for the buffers/files prompt:

org-agenda-files,~/other_org_dir/org-file1.org,*scratch*

If this is a satisfactory solution, i'll amend the test cases as well

@alphapapa
Copy link
Owner

Thanks, I think this will work pretty well. A little feedback: here's another way to write this function that I think is a bit clearer:

(defun org-ql-view--expand-buffers-files (buffers-files)
  "Return BUFFERS-FILES expanded to a list of files or buffers.
The counterpart to `org-ql-view--contract-buffers-files'."
  (--> (-list buffers-files)
    (pcase-exhaustive it
      ("all" (--select (equal (buffer-local-value 'major-mode it) 'org-mode)
                       (buffer-list)))
      ("org-agenda-files" (org-agenda-files))
      ("org-directory" (org-ql-search-directories-files))
      ((or "" "buffer") (current-buffer))
      ((pred bufferp) (list it))
      ((pred listp) (list it))
      ;; A single filename.
      ((pred stringp) (list it)))
    -non-nil -uniq -flatten))

@ahmed-shariff
Copy link
Author

Finally got around to wrapping this up.
I've added the functions and the test suites.

Copy link
Owner

@alphapapa alphapapa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. This is a quick first-pass review. After this review is addressed, I'll do a more thorough one when I have time.

org-ql-view.el Outdated Show resolved Hide resolved
org-ql-view.el Outdated Show resolved Hide resolved
org-ql-view.el Outdated Show resolved Hide resolved
org-ql-view.el Outdated Show resolved Hide resolved
Comment on lines -1689 to +1701
:to-throw 'error '("CAUTION: Link not opened because unsafe buffers-files parameter detected: (lambda nil (error UNSAFE))")))
:to-throw 'error '("Value lambda is not a valid buffer/file")))
(it "Errors for an unquoted lambda"
(expect (open-link unquoted-lambda-link)
:to-throw 'error '("CAUTION: Link not opened because unsafe buffers-files parameter detected: (lambda nil (error UNSAFE))")))
:to-throw 'error '("Value lambda is not a valid buffer/file")))
(it "Errors for a quoted lambda in a list"
(if (version< (org-version) "9.3")
(expect (open-link quoted-lambda-in-list-link)
:to-throw 'error '("CAUTION: Link not opened because unsafe buffers-files parameter detected: ((quote (lambda nil (error UNSAFE))))"))
:to-throw 'error '("Value (quote (lambda nil (error UNSAFE))) is not a valid buffer/file"))
(expect (open-link quoted-lambda-in-list-link)
:to-throw 'error '("CAUTION: Link not opened because unsafe buffers-files parameter detected: ('(lambda nil (error UNSAFE)))"))))
:to-throw 'error '("Value (quote (lambda nil (error UNSAFE))) is not a valid buffer/file"))))
(it "Errors for an unquoted lambda in a list"
(expect (open-link unquoted-lambda-in-list-link)
:to-throw 'error '("CAUTION: Link not opened because unsafe buffers-files parameter detected: ((lambda nil (error UNSAFE)))"))))
:to-throw 'error '("Value (lambda nil (error UNSAFE)) is not a valid buffer/file"))))
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you change these errors? These are important safety tests.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had added a explicit error when the input to the org-ql-view--expand-buffers-files function,

(_ (error (format "Value %s is not a valid buffer/file" buffer-file)))))

According to my understanding, the previous errors being tested were because of the pcase failing. So roll back the error I triggering and the pacse to fail which would lead to the older errors?
Even then, in this implementation the return value is always a list, which makes the error being produced to be a bit different than what it previously had.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what you mean. Do you understand the potential security issue here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To clarify, the potential values for the org-ql-view--expand-buffers-files now are the following:

  • A buffer
  • A string
  • A file-name
  • one of "all", "org-agenda-files", "org-directory", "buffer", or an empty string (which evaluates to the same values as "buffer")
  • a list containing above values

I am also converting all buffer objects to string values to avoid duplicates that are introduced because of the buffer/buffer-name of a file and a file-name being passed.

As a result this function now always returns a list of strings (or at least should, will add tests for these :D).

This is in part due to moving to using completing-read-multiple which returns a list by default. Because of this, I had dropped the listp predicate in the pcase inside the function since now all elements in the list are being processed individually. This in-turn results in the unsafe values for buffers/files being tested in the link safety section never getting to the point where that error gets signalled since they never match any of the values in the current pcase. Which was why I was signalling an error when an invalid value is passed. Does this make sense?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I may have overlooked that functions are a valid input to buffers-files in org-ql-select. Which might be creating a whole bunch of new problems :)

Currently (in the master branch) the following should create a view with the function

(org-ql-search #'a-function-returning-list-of-files '(level 1))

with the value for org-ql-view-buffers-files is set to #'a-function-returning-list-of-files.

If I understand this correctly, this is left as such so refreshing the view would recall the function? (or alternatively the evaluated value can be stored?)

I am not sure how a function would translate to a value in completing-read-mulitple, so I am skipping prompting for that entirely when refreshing a view with a function as a value for org-ql-view-buffers-files.

The safety concern you were referring to before comes from allowing a function to be used as a parameter for org-ql-select? Currently the org-ql-view--expand-buffers-files function would signal an error if used with a function, and when storing a link, the function's evaled value is used for buffers-files.

Does that cover the problem with unsafe values for buffers-files?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can see where the error is signaled here:

(error "CAUTION: Link not opened because unsafe buffers-files parameter detected: %s" buffers-files))

That safety check should be left there, in that function, where links are followed. IIUC, the change you made to the tests would cause that check to not be tested, which could lead to security vulnerabilities in the future.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That check looks at either the value returned by the org-ql-view--expand-buffers-files or the current-buffer. If I understand it correctly, it was there to make sure the value returned by the org-ql-view--expand-buffers-files function is not another function that can get evaluated once passed to org-ql-select. Currently, if I understand when and how org-ql-view--expand-buffers-files gets called, in a valid situation, it only should get values that I had previously mentioned, anything else would result in the error on the new tests being signaled.

If the concern is future changes to the org-ql-view--expand-buffers-files function results in returning a function value, that function can be mocked to make sure the error in

(error "CAUTION: Link not opened because unsafe buffers-files parameter detected: %s" buffers-files))

get's signaled?

tests/test-org-ql.el Outdated Show resolved Hide resolved
tests/test-org-ql.el Outdated Show resolved Hide resolved
@alphapapa
Copy link
Owner

BTW, it would be easier for me to review the code and the changes made in response if you left the conversations "unresolved" until the changes are actually made. When I come back to a large change like this after a while, it takes some time to reacquaint myself with it and what I said about it before.

org-ql-view.el Outdated Show resolved Hide resolved
org-ql-view.el Outdated Show resolved Hide resolved
@alphapapa
Copy link
Owner

@ahmed-shariff If I may be frank, every time I revisit this PR, I feel lost. Reading all of the discussion again, it's still hard to understand exactly what this PR is intended to address and how it does. It's probably my fault for not defining the problems more clearly in the first place before giving feedback on code.

I wish that I could just merge the code and deal with any minor fallout later, but given the potential security issues (even though they might be downstream from this PR's code), I don't feel like that would be the responsible thing to do.

I realize that you've put a lot of work into this patch, and that you've been very patient with my requested changes, so I don't want to discard your work. Would you be willing to consider starting this process over, defining the problems more explicitly in an issue, then addressing them in one or more new PRs, which could reuse the code from this one? I think this is a case where some degree of test-driven development would be helpful--at least, for me, as I try to understand the problems we're trying to solve and exactly how we're trying to do it.

For example, I'd like to first have the problems clearly described in one or more issues, then have a PR for each one, each of which should start by adding a failing test that should be fixed by later commits. I'm trying to develop this package in a more organized way to ensure that it remains reliable and robust, but that does sometimes mean more overhead for contributions. As well, since I work on this in spare time, it sometimes takes a while to review and integrate patches.

Let me know what you think. Thanks.

@ahmed-shariff
Copy link
Author

I totally understand. Ill close this PR and start anew.

@ahmed-shariff
Copy link
Author

if it's any consolation, I also need a few minutes every time I revisit this XD

@alphapapa
Copy link
Owner

Thanks.

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

Successfully merging this pull request may close these issues.

Use of :initial-input in org-ql-view--expand-buffers-files conflicting with completing-read
2 participants