#
# History:
#
+# 2022-11-11, anonymous2ch
+# version 0.8.6: ignore utf-8 decoding errors
+#
+# 2021-05-02, Sébastien Helleu <flashcode@flashtux.org>
+# version 0.8.5: add compatibility with WeeChat >= 3.2 (XDG directories)
+#
+# 2020-10-11, Thom Wiggers <thom@thomwiggers.nl>
+# version 0.8.4: Python3 compatibility fix
+#
+# 2020-05-06, Dominique Martinet <asmadeus@codewreck.org> and hexa-
+# version 0.8.3: more python3 compatibility fixes...
+#
+# 2019-06-30, dabbill <dabbill@gmail.com>
+# and Sébastien Helleu <flashcode@flashtux.org>
+# version 0.8.2: make script compatible with Python 3
+#
# 2018-04-10, Sébastien Helleu <flashcode@flashtux.org>
# version 0.8.1: fix infolist_time for WeeChat >= 2.2 (WeeChat returns a long
# integer instead of a string)
# * supress highlights when printing in grep buffer
#
# 2010-10-06
-# version 0.6.7: by xt <xt@bash.no>
+# version 0.6.7: by xt <xt@bash.no>
# * better temporary file:
-# use tempfile.mkstemp. to create a temp file in log dir,
+# use tempfile.mkstemp. to create a temp file in log dir,
# makes it safer with regards to write permission and multi user
#
# 2010-04-08
SCRIPT_NAME = "grep"
SCRIPT_AUTHOR = "Elián Hanisch <lambdae2@gmail.com>"
-SCRIPT_VERSION = "0.8.1"
+SCRIPT_VERSION = "0.8.6"
SCRIPT_LICENSE = "GPL3"
SCRIPT_DESC = "Search in buffers and logs"
SCRIPT_COMMAND = "grep"
def get_matches_count(self):
"""Return the sum of total matches stored."""
if dict.__len__(self):
- return sum(map(lambda L: L.matches_count, self.itervalues()))
+ return sum(map(lambda L: L.matches_count, self.values()))
else:
return 0
def __len__(self):
"""Return the sum of total lines stored."""
if dict.__len__(self):
- return sum(map(len, self.itervalues()))
+ return sum(map(len, self.values()))
else:
return 0
"""Returns buffer count or buffer name if there's just one stored."""
n = len(self.keys())
if n == 1:
- return self.keys()[0]
+ return list(self.keys())[0]
elif n > 1:
return '%s logs' %n
else:
def items(self):
"""Returns a list of items sorted by line count."""
- items = dict.items(self)
+ items = list(dict.items(self))
items.sort(key=lambda i: len(i[1]))
return items
def items_count(self):
"""Returns a list of items sorted by match count."""
- items = dict.items(self)
+ items = list(dict.items(self))
items.sort(key=lambda i: i[1].matches_count)
return items
def strip_separator(self):
- for L in self.itervalues():
+ for L in self.values():
L.strip_separator()
def get_last_lines(self, n):
if n >= total_lines:
# nothing to do
return
- for k, v in reversed(self.items()):
+ for k, v in reversed(list(self.items())):
l = len(v)
if n > 0:
if l > n:
return []
def get_home():
- home = weechat.config_string(weechat.config_get('logger.file.path'))
- home = home.replace('%h', weechat.info_get('weechat_dir', ''))
- home = path.abspath(path.expanduser(home))
+ options = {
+ 'directory': 'data',
+ }
+ home = weechat.string_eval_path_home(
+ weechat.config_string(weechat.config_get('logger.file.path')),
+ {}, {}, options,
+ )
return home
def strip_home(s, dir=''):
return cache_dir[key]
except KeyError:
pass
-
+
filter_list = filter_list or get_config_log_filter()
dir_len = len(dir)
if filter_list:
if '$server' in mask:
mask = mask.replace('$server', server)
# change the unreplaced vars by '*'
- from string import letters
+ try:
+ from string import letters
+ except ImportError:
+ from string import ascii_letters as letters
if '%' in mask:
# vars for time formatting
mask = mask.replace('%', '$')
regexp = re.compile(pattern, re.IGNORECASE)
else:
regexp = re.compile(pattern)
- except Exception, e:
- raise Exception, 'Bad pattern, %s' %e
+ except Exception as e:
+ raise Exception('Bad pattern, %s' % e)
return regexp
def check_string(s, regexp, hilight='', exact=False):
return s
else:
check = lambda s: check_string(s, regexp, hilight, exact)
-
+
try:
- file_object = open(file, 'r')
+ file_object = open(file, 'r', errors='ignore')
except IOError:
# file doesn't exist
return lines
before_context, after_context = after_context, before_context
if before_context:
- before_context_range = range(1, before_context + 1)
+ before_context_range = list(range(1, before_context + 1))
before_context_range.reverse()
limit = tail or head
while id < after_context + offset:
id += 1
try:
- context_line = file_object.next()
+ context_line = next(file_object)
_context_line = check(context_line)
if _context_line:
offset = id
check = lambda s: check_string(s, regexp, hilight, exact)
if before_context:
- before_context_range = range(1, before_context + 1)
- before_context_range.reverse()
+ before_context_range = reversed(range(1, before_context + 1))
while infolist_next(infolist):
line = get_line(infolist)
buffer_update()
else:
global hook_file_grep, grep_stdout, grep_stderr, pattern_tmpl
- grep_stdout = grep_stderr = ''
+ grep_stdout = grep_stderr = b''
hook_file_grep = weechat.hook_process(
'func:grep_process',
get_config_int('timeout_secs') * 1000,
global grep_options, log_pairs
for log_name, log in log_pairs:
result[log_name] = grep_file(log, *grep_options)
- except Exception, e:
+ except Exception as e:
result = e
- return pickle.dumps(result)
-
-grep_stdout = grep_stderr = ''
+ return pickle.dumps(result, 0)
def grep_process_cb(data, command, return_code, out, err):
global grep_stdout, grep_stderr, matched_lines, hook_file_grep
+ if isinstance(out, str):
+ out = out.encode()
grep_stdout += out
+
+ if isinstance(err, str):
+ err = err.encode()
grep_stderr += err
def set_buffer_error(message):
if isinstance(data, Exception):
raise data
matched_lines.update(data)
- except Exception, e:
+ except Exception as e:
set_buffer_error(repr(e))
return WEECHAT_RC_OK
else:
# free matched_lines so it can be removed from memory
del matched_lines
-
+
def split_line(s):
"""Splits log's line 's' in 3 parts, date, nick and msg."""
global weechat_format
weechat.infolist_free(infolist)
try:
cmd_grep_parsing(input_data)
- except Exception, e:
- error('Argument error, %s' %e, buffer=buffer)
+ except Exception as e:
+ error('Argument error, %s' % e, buffer=buffer)
return WEECHAT_RC_OK
try:
show_matching_lines()
- except Exception, e:
+ except Exception as e:
error(e)
except NameError:
error("There isn't any previous search to repeat.", buffer=buffer)
args = ' '.join(args) # join pattern for keep spaces
if args:
- pattern_tmpl = args
+ pattern_tmpl = args
pattern = _tmplRe.sub(tmplReplacer, args)
debug('Using regexp: %s', pattern)
if not pattern:
- raise Exception, 'No pattern for grep the logs.'
+ raise Exception('No pattern for grep the logs.')
def positive_number(opt, val):
try:
opt = '-' + opt
else:
opt = '--' + opt
- raise Exception, "argument for %s must be a positive integer." %opt
+ raise Exception("argument for %s must be a positive integer." % opt)
for opt, val in opts:
opt = opt.strip('-')
# parse
try:
cmd_grep_parsing(args)
- except Exception, e:
- error('Argument error, %s' %e)
+ except Exception as e:
+ error('Argument error, %s' % e)
return WEECHAT_RC_OK
# find logs
# grepping
try:
show_matching_lines()
- except Exception, e:
+ except Exception as e:
error(e)
return WEECHAT_RC_OK
opt = opt.strip('-')
if opt in ('size', 's'):
sort_by_size = True
- except Exception, e:
- error('Argument error, %s' %e)
+ except Exception as e:
+ error('Argument error, %s' % e)
return WEECHAT_RC_OK
# is there's a filter, filter_excludes should be False
buffer = buffer_create()
if get_config_boolean('clear_buffer'):
weechat.buffer_clear(buffer)
- file_list = zip(file_list, file_sizes)
+ file_list = list(zip(file_list, file_sizes))
msg = 'Found %s logs.' %len(file_list)
print_line(msg, buffer, display=True)
'completion_grep_args', '')
# settings
- for opt, val in settings.iteritems():
+ for opt, val in settings.items():
if not weechat.config_is_set_plugin(opt):
weechat.config_set_plugin(opt, val)
color_summary = weechat.color('lightcyan')
color_delimiter = weechat.color('chat_delimiters')
color_script_nick = weechat.color('chat_nick')
-
+
# pretty [grep]
script_nick = '%s[%s%s%s]%s' %(color_delimiter, color_script_nick, SCRIPT_NAME, color_delimiter,
color_reset)
debug = pybuffer.debugBuffer(globals(), '%s_debug' % SCRIPT_NAME)
except:
def debug(s, *args):
- if not isinstance(s, basestring):
- s = str(s)
+ try:
+ if not isinstance(s, basestring):
+ s = str(s)
+ except NameError:
+ pass
if args:
s = s %args
prnt('', '%s\t%s' %(script_nick, s))