mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 08:24:40 +01:00
history pull (#5047)
Co-authored-by: a <aaa@aaa.aaa> Closes https://github.com/xonsh/xonsh/issues/5044
This commit is contained in:
parent
6cf78656c7
commit
ebb6abd200
5 changed files with 87 additions and 1 deletions
|
@ -255,6 +255,13 @@ may be useful to share entries between shell sessions. In such a case, one can u
|
||||||
the ``flush`` action to immediately save the session history to disk and make it
|
the ``flush`` action to immediately save the session history to disk and make it
|
||||||
accessible from other shell sessions.
|
accessible from other shell sessions.
|
||||||
|
|
||||||
|
``pull`` action
|
||||||
|
================
|
||||||
|
Tries to pull the history from parallel sessions and add to the current session.
|
||||||
|
|
||||||
|
For example if there are two parallel terminal windows the run of ``history pull``
|
||||||
|
command from the second terminal window will get the commands from the first terminal.
|
||||||
|
|
||||||
``clear`` action
|
``clear`` action
|
||||||
================
|
================
|
||||||
Deletes the history from the current session up until this point. Later commands
|
Deletes the history from the current session up until this point. Later commands
|
||||||
|
|
23
news/history_pull.rst
Normal file
23
news/history_pull.rst
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
**Added:**
|
||||||
|
|
||||||
|
* Added ``history pull`` command to SQLite history backend to pull the history from parallel sessions and add to the current session.
|
||||||
|
|
||||||
|
**Changed:**
|
||||||
|
|
||||||
|
* <news item>
|
||||||
|
|
||||||
|
**Deprecated:**
|
||||||
|
|
||||||
|
* <news item>
|
||||||
|
|
||||||
|
**Removed:**
|
||||||
|
|
||||||
|
* <news item>
|
||||||
|
|
||||||
|
**Fixed:**
|
||||||
|
|
||||||
|
* <news item>
|
||||||
|
|
||||||
|
**Security:**
|
||||||
|
|
||||||
|
* <news item>
|
|
@ -130,6 +130,10 @@ class History:
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def pull(self, **kwargs):
|
||||||
|
"""Pull history from other parallel sessions."""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def flush(self, **kwargs):
|
def flush(self, **kwargs):
|
||||||
"""Flush the history items to disk from a buffer."""
|
"""Flush the history items to disk from a buffer."""
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -281,6 +281,31 @@ class HistoryAlias(xcli.ArgParserAlias):
|
||||||
return
|
return
|
||||||
print(str(hist.sessionid), file=_stdout)
|
print(str(hist.sessionid), file=_stdout)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pull(show_commands=False, _stdout=None):
|
||||||
|
"""Pull history from other parallel sessions.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
show_commands: -c, --show-commands
|
||||||
|
show pulled commands
|
||||||
|
"""
|
||||||
|
|
||||||
|
hist = XSH.history
|
||||||
|
|
||||||
|
if hist.pull.__module__ == "xonsh.history.base":
|
||||||
|
backend = XSH.env.get("XONSH_HISTORY_BACKEND", "unknown")
|
||||||
|
print(
|
||||||
|
f"Pull method is not supported in {backend} history backend.",
|
||||||
|
file=_stdout,
|
||||||
|
)
|
||||||
|
|
||||||
|
lines_added = hist.pull(show_commands)
|
||||||
|
if lines_added:
|
||||||
|
print(f"Added {lines_added} records!", file=_stdout)
|
||||||
|
else:
|
||||||
|
print(f"No records found!", file=_stdout)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def flush(_stdout):
|
def flush(_stdout):
|
||||||
"""Flush the current history to disk"""
|
"""Flush the current history to disk"""
|
||||||
|
@ -428,7 +453,7 @@ class HistoryAlias(xcli.ArgParserAlias):
|
||||||
|
|
||||||
dest.flush()
|
dest.flush()
|
||||||
|
|
||||||
self.out("done.")
|
self.out("Done")
|
||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
parser = self.create_parser(prog="history")
|
parser = self.create_parser(prog="history")
|
||||||
|
@ -436,6 +461,7 @@ class HistoryAlias(xcli.ArgParserAlias):
|
||||||
parser.add_command(self.id_cmd, prog="id")
|
parser.add_command(self.id_cmd, prog="id")
|
||||||
parser.add_command(self.file)
|
parser.add_command(self.file)
|
||||||
parser.add_command(self.info)
|
parser.add_command(self.info)
|
||||||
|
parser.add_command(self.pull)
|
||||||
parser.add_command(self.flush)
|
parser.add_command(self.flush)
|
||||||
parser.add_command(self.off)
|
parser.add_command(self.off)
|
||||||
parser.add_command(self.on)
|
parser.add_command(self.on)
|
||||||
|
|
|
@ -204,6 +204,15 @@ def xh_sqlite_delete_items(size_to_keep, filename=None):
|
||||||
return _xh_sqlite_delete_records(c, size_to_keep)
|
return _xh_sqlite_delete_records(c, size_to_keep)
|
||||||
|
|
||||||
|
|
||||||
|
def xh_sqlite_pull(filename, last_pull_time, current_sessionid):
|
||||||
|
sql = f"SELECT inp FROM xonsh_history WHERE tsb > ? AND sessionid != ? ORDER BY tsb"
|
||||||
|
params = [last_pull_time, current_sessionid]
|
||||||
|
with _xh_sqlite_get_conn(filename=filename) as conn:
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute(sql, tuple(params))
|
||||||
|
return c.fetchall()
|
||||||
|
|
||||||
|
|
||||||
def xh_sqlite_wipe_session(sessionid=None, filename=None):
|
def xh_sqlite_wipe_session(sessionid=None, filename=None):
|
||||||
"""Wipe the current session's entries from the database."""
|
"""Wipe the current session's entries from the database."""
|
||||||
sql = "DELETE FROM xonsh_history WHERE sessionid = ?"
|
sql = "DELETE FROM xonsh_history WHERE sessionid = ?"
|
||||||
|
@ -256,6 +265,7 @@ class SqliteHistory(History):
|
||||||
if filename is None:
|
if filename is None:
|
||||||
filename = _xh_sqlite_get_file_name()
|
filename = _xh_sqlite_get_file_name()
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
|
self.last_pull_time = time.time()
|
||||||
self.gc = SqliteHistoryGC() if gc else None
|
self.gc = SqliteHistoryGC() if gc else None
|
||||||
self._last_hist_inp = None
|
self._last_hist_inp = None
|
||||||
self.inps = []
|
self.inps = []
|
||||||
|
@ -345,6 +355,22 @@ class SqliteHistory(History):
|
||||||
data["gc options"] = envs.get("XONSH_HISTORY_SIZE")
|
data["gc options"] = envs.get("XONSH_HISTORY_SIZE")
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def pull(self, show_commands=False):
|
||||||
|
if not hasattr(XSH.shell.shell, "prompter"):
|
||||||
|
print(f"Shell type {XSH.shell.shell} is not supported.")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
cnt = 0
|
||||||
|
for r in xh_sqlite_pull(
|
||||||
|
self.filename, self.last_pull_time, str(self.sessionid)
|
||||||
|
):
|
||||||
|
if show_commands:
|
||||||
|
print(r[0])
|
||||||
|
XSH.shell.shell.prompter.history.append_string(r[0])
|
||||||
|
cnt += 1
|
||||||
|
self.last_pull_time = time.time()
|
||||||
|
return cnt
|
||||||
|
|
||||||
def run_gc(self, size=None, blocking=True):
|
def run_gc(self, size=None, blocking=True):
|
||||||
self.gc = SqliteHistoryGC(wait_for_shell=False, size=size)
|
self.gc = SqliteHistoryGC(wait_for_shell=False, size=size)
|
||||||
if blocking:
|
if blocking:
|
||||||
|
|
Loading…
Add table
Reference in a new issue