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

gh-112105: Make completer delims work on libedit #112106

Merged
merged 3 commits into from
Nov 28, 2023

Conversation

gaogaotiantian
Copy link
Member

@gaogaotiantian gaogaotiantian commented Nov 15, 2023

@gaogaotiantian
Copy link
Member Author

@gpshead @vstinner are you familiar with readline? Could you take a look at the PR? Thanks!

@gaogaotiantian
Copy link
Member Author

Hi @corona10 , I just realized you have spent sometime on libedit when I was reviewing the history of the file. Could you share your thoughts of the PR? Thanks!

@corona10 corona10 self-assigned this Nov 21, 2023
@corona10
Copy link
Member

@gaogaotiantian I will take a look at this PR in this weekend :)

@corona10
Copy link
Member

@gaogaotiantian Sorry for the delay, I will take a look at in 2-3 days.

@gaogaotiantian
Copy link
Member Author

@gaogaotiantian Sorry for the delay, I will take a look at in 2-3 days.

No worries!

@corona10 corona10 added needs backport to 3.11 only security fixes needs backport to 3.12 bug and security fixes labels Nov 28, 2023
@@ -576,6 +576,7 @@ readline_set_completer_delims(PyObject *module, PyObject *string)
if (break_chars) {
free(completer_word_break_characters);
completer_word_break_characters = break_chars;
rl_basic_word_break_characters = break_chars;
Copy link
Member

Choose a reason for hiding this comment

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

Okay so it's kinds of implementation detail.
Since we enable the flag for libedit in following way.

AH_TEMPLATE([WITH_EDITLINE], [Define to build the readline module against libedit.])

What about changing the code for the libedit implementation only?

Suggested change
rl_basic_word_break_characters = break_chars;
#ifdef WITH_EDITLINE
// Comment why this is needed
rl_basic_word_break_characters = break_chars;
#endif

Copy link
Member Author

Choose a reason for hiding this comment

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

From the comments in the file:

 * This emulation library is not 100% API compatible with the "real" readline
 * and cannot be detected at compile-time,
 * hence we use a runtime check to detect if the Python readline module is
 * linked to libedit.

It seems like we are not able to detect if libedit is used at compile time. I doubt if the macro protection would actually work in all cases.

Copy link
Member Author

Choose a reason for hiding this comment

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

Do our official binaries build with libedit ever?

Copy link
Member

@corona10 corona10 Nov 28, 2023

Choose a reason for hiding this comment

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

It seems like we are not able to detect if libedit is used at compile time

I am not sure when the comment was added.
But we can detect editline at build-time from Python 3.10
https://docs.python.org/3/using/configure.html?highlight=with_editline#cmdoption-with-readline

Copy link
Member

Choose a reason for hiding this comment

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

Copy link
Member

@corona10 corona10 Nov 28, 2023

Choose a reason for hiding this comment

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

Do our official binaries build with libedit ever?

Even if our official build does not use it, we should consider downstream distros :)

Copy link
Member Author

Choose a reason for hiding this comment

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

That's actually not what I meant. What I meant is - we could have been using libedit without WITH_EDITLINE. So even if we do not define WITH_EDITLINE, we could still be using libedit. I just confirmed on my mac that this change will break the test.

The reason I quoted that comment was that I believed such case exists - where we don't know if libedit is being used at compile time.

Copy link
Member

@corona10 corona10 Nov 28, 2023

Choose a reason for hiding this comment

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

we could have been using libedit without WITH_EDITLINE.
From what I can observe, writing to both variables has no unexpected side effect, because rl_basic_word_break_characters is not used on CPython with GNU deadline.

Got it, then should we consider using both using_libedit_emulation and WITH_EDITLINE?
If you think that we don't have to consider side effect from the implementation detail, then we can just add a comment why we do this.

Copy link
Member

@corona10 corona10 Nov 28, 2023

Choose a reason for hiding this comment

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

I checked that following suggestion pass the test on my macOS.

Suggested change
rl_basic_word_break_characters = break_chars;
#ifdef WITH_EDITLINE
rl_basic_word_break_characters = break_chars;
#else
if (using_libedit_emulation) rl_basic_word_break_characters = break_chars;
#endif

Copy link
Member Author

Choose a reason for hiding this comment

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

Sorry I did not use your suggestion directly. I do like the brackets for the if statement. I applied the protection to avoid side effects for GNU readline on both cases.

@@ -1267,6 +1268,7 @@ setup_readline(readlinestate *mod_state)
completer_word_break_characters =
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
/* All nonalphanums except '.' */
rl_basic_word_break_characters = completer_word_break_characters;
Copy link
Member

Choose a reason for hiding this comment

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

Copy link
Member

@corona10 corona10 left a comment

Choose a reason for hiding this comment

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

lgtm!!
Thanks for the work @gaogaotiantian

@corona10 corona10 enabled auto-merge (squash) November 28, 2023 06:15
@corona10 corona10 merged commit 2df26d8 into python:main Nov 28, 2023
32 checks passed
@miss-islington-app
Copy link

Thanks @gaogaotiantian for the PR, and @corona10 for merging it 🌮🎉.. I'm working now to backport this PR to: 3.11, 3.12.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Nov 28, 2023
(cherry picked from commit 2df26d8)

Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
@bedevere-app
Copy link

bedevere-app bot commented Nov 28, 2023

GH-112487 is a backport of this pull request to the 3.12 branch.

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Nov 28, 2023
(cherry picked from commit 2df26d8)

Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
@bedevere-app bedevere-app bot removed the needs backport to 3.12 bug and security fixes label Nov 28, 2023
@bedevere-app
Copy link

bedevere-app bot commented Nov 28, 2023

GH-112488 is a backport of this pull request to the 3.11 branch.

@bedevere-app bedevere-app bot removed the needs backport to 3.11 only security fixes label Nov 28, 2023
corona10 pushed a commit that referenced this pull request Nov 28, 2023
…h-112488)

gh-112105: Make completer delims work on libedit (gh-112106)
(cherry picked from commit 2df26d8)

Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
corona10 pushed a commit that referenced this pull request Nov 28, 2023
…h-112487)

gh-112105: Make completer delims work on libedit (gh-112106)
(cherry picked from commit 2df26d8)

Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
@gaogaotiantian gaogaotiantian deleted the readline-delim branch November 28, 2023 06:48
aisk pushed a commit to aisk/cpython that referenced this pull request Feb 11, 2024
Glyphack pushed a commit to Glyphack/cpython that referenced this pull request Sep 2, 2024
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

Successfully merging this pull request may close these issues.

2 participants