##// END OF EJS Templates
add note about the 1000 / --keep variable
Paul Ivanov -
Show More
@@ -1,123 +1,124 b''
1 1 # encoding: utf-8
2 2 """
3 3 An application for managing IPython history.
4 4
5 5 To be invoked as the `ipython history` subcommand.
6 6 """
7 7 from __future__ import print_function
8 8
9 9 import os
10 10 import sqlite3
11 11
12 12 from IPython.config.application import Application
13 13 from IPython.core.application import BaseIPythonApplication
14 14 from IPython.utils.traitlets import Bool, Int, Dict
15 15
16 16 trim_hist_help = """Trim the IPython history database to the last 1000 entries.
17 17
18 18 This actually copies the last 1000 entries to a new database, and then replaces
19 the old file with the new.
19 the old file with the new. Use the `--keep=` argument to specify a number
20 other than 1000.
20 21 """
21 22
22 23 class HistoryTrim(BaseIPythonApplication):
23 24 description = trim_hist_help
24 25
25 26 backup = Bool(False, config=True,
26 27 help="Keep the old history file as history.sqlite.<N>")
27 28
28 29 keep = Int(1000, config=True,
29 30 help="Number of recent lines to keep in the database.")
30 31
31 32 flags = Dict(dict(
32 33 backup = ({'HistoryTrim' : {'backup' : True}},
33 34 backup.get_metadata('help')
34 35 )
35 36 ))
36 37
37 38 aliases=Dict(dict(
38 39 keep = 'HistoryTrim.keep'
39 40 ))
40 41
41 42 def start(self):
42 43 profile_dir = self.profile_dir.location
43 44 hist_file = os.path.join(profile_dir, 'history.sqlite')
44 45 con = sqlite3.connect(hist_file)
45 46
46 47 # Grab the recent history from the current database.
47 48 inputs = list(con.execute('SELECT session, line, source, source_raw FROM '
48 49 'history ORDER BY session DESC, line DESC LIMIT ?', (self.keep+1,)))
49 50 if len(inputs) <= self.keep:
50 51 print("There are already at most %d entries in the history database." % self.keep)
51 52 print("Not doing anything. Use --keep= argument to keep fewer entries")
52 53 return
53 54
54 55 print("Trimming history to the most recent %d entries." % self.keep)
55 56
56 57 inputs.pop() # Remove the extra element we got to check the length.
57 58 inputs.reverse()
58 59 first_session = inputs[0][0]
59 60 outputs = list(con.execute('SELECT session, line, output FROM '
60 61 'output_history WHERE session >= ?', (first_session,)))
61 62 sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
62 63 'sessions WHERE session >= ?', (first_session,)))
63 64 con.close()
64 65
65 66 # Create the new history database.
66 67 new_hist_file = os.path.join(profile_dir, 'history.sqlite.new')
67 68 i = 0
68 69 while os.path.exists(new_hist_file):
69 70 # Make sure we don't interfere with an existing file.
70 71 i += 1
71 72 new_hist_file = os.path.join(profile_dir, 'history.sqlite.new'+str(i))
72 73 new_db = sqlite3.connect(new_hist_file)
73 74 new_db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
74 75 primary key autoincrement, start timestamp,
75 76 end timestamp, num_cmds integer, remark text)""")
76 77 new_db.execute("""CREATE TABLE IF NOT EXISTS history
77 78 (session integer, line integer, source text, source_raw text,
78 79 PRIMARY KEY (session, line))""")
79 80 new_db.execute("""CREATE TABLE IF NOT EXISTS output_history
80 81 (session integer, line integer, output text,
81 82 PRIMARY KEY (session, line))""")
82 83 new_db.commit()
83 84
84 85
85 86 with new_db:
86 87 # Add the recent history into the new database.
87 88 new_db.executemany('insert into sessions values (?,?,?,?,?)', sessions)
88 89 new_db.executemany('insert into history values (?,?,?,?)', inputs)
89 90 new_db.executemany('insert into output_history values (?,?,?)', outputs)
90 91 new_db.close()
91 92
92 93 if self.backup:
93 94 i = 1
94 95 backup_hist_file = os.path.join(profile_dir, 'history.sqlite.old.%d' % i)
95 96 while os.path.exists(backup_hist_file):
96 97 i += 1
97 98 backup_hist_file = os.path.join(profile_dir, 'history.sqlite.old.%d' % i)
98 99 os.rename(hist_file, backup_hist_file)
99 100 print("Backed up longer history file to", backup_hist_file)
100 101 else:
101 102 os.remove(hist_file)
102 103
103 104 os.rename(new_hist_file, hist_file)
104 105
105 106
106 107 class HistoryApp(Application):
107 108 name = u'ipython-history'
108 109 description = "Manage the IPython history database."
109 110
110 111 subcommands = Dict(dict(
111 112 trim = (HistoryTrim, HistoryTrim.description.splitlines()[0]),
112 113 ))
113 114
114 115 def start(self):
115 116 if self.subapp is None:
116 117 print("No subcommand specified. Must specify one of: %s" % \
117 118 (self.subcommands.keys()))
118 119 print()
119 120 self.print_description()
120 121 self.print_subcommands()
121 122 self.exit(1)
122 123 else:
123 124 return self.subapp.start()
General Comments 0
You need to be logged in to leave comments. Login now