]> git.rmz.io Git - dotfiles.git/blobdiff - weechat/python/grep.py
bin: add mediainfo.py script to simplify ranger previews
[dotfiles.git] / weechat / python / grep.py
index 19415311fa33e57855456e162f10ac240fea86ba..b6751225a5320df67770b3012f2e2816ab4bba0b 100644 (file)
 #
 #   History:
 #
 #
 #   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)
 #   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
 #   * 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:
 #   * 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
 #    makes it safer with regards to write permission and multi user
 #
 #   2010-04-08
@@ -226,7 +242,7 @@ except ImportError:
 
 SCRIPT_NAME    = "grep"
 SCRIPT_AUTHOR  = "Elián Hanisch <lambdae2@gmail.com>"
 
 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"
 SCRIPT_LICENSE = "GPL3"
 SCRIPT_DESC    = "Search in buffers and logs"
 SCRIPT_COMMAND = "grep"
@@ -259,14 +275,14 @@ class linesDict(dict):
     def get_matches_count(self):
         """Return the sum of total matches stored."""
         if dict.__len__(self):
     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):
         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
 
         else:
             return 0
 
@@ -274,7 +290,7 @@ class linesDict(dict):
         """Returns buffer count or buffer name if there's just one stored."""
         n = len(self.keys())
         if n == 1:
         """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:
         elif n > 1:
             return '%s logs' %n
         else:
@@ -282,18 +298,18 @@ class linesDict(dict):
 
     def items(self):
         """Returns a list of items sorted by line count."""
 
     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.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):
         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):
             L.strip_separator()
 
     def get_last_lines(self, n):
@@ -302,7 +318,7 @@ class linesDict(dict):
         if n >= total_lines:
             # nothing to do
             return
         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:
             l = len(v)
             if n > 0:
                 if l > n:
@@ -442,9 +458,13 @@ def get_config_log_filter():
         return []
 
 def get_home():
         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 home
 
 def strip_home(s, dir=''):
@@ -487,7 +507,7 @@ def dir_list(dir, filter_list=(), filter_excludes=True, include_dir=False):
         return cache_dir[key]
     except KeyError:
         pass
         return cache_dir[key]
     except KeyError:
         pass
-    
+
     filter_list = filter_list or get_config_log_filter()
     dir_len = len(dir)
     if filter_list:
     filter_list = filter_list or get_config_log_filter()
     dir_len = len(dir)
     if filter_list:
@@ -592,7 +612,10 @@ def get_file_by_name(buffer_name):
             if '$server' in mask:
                 mask = mask.replace('$server', server)
         # change the unreplaced vars by '*'
             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('%', '$')
         if '%' in mask:
             # vars for time formatting
             mask = mask.replace('%', '$')
@@ -657,8 +680,8 @@ def make_regexp(pattern, matchcase=False):
             regexp = re.compile(pattern, re.IGNORECASE)
         else:
             regexp = re.compile(pattern)
             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 regexp
 
 def check_string(s, regexp, hilight='', exact=False):
@@ -716,9 +739,9 @@ def grep_file(file, head, tail, after_context, before_context, count, regexp, hi
                 return s
     else:
         check = lambda s: check_string(s, regexp, hilight, exact)
                 return s
     else:
         check = lambda s: check_string(s, regexp, hilight, exact)
-    
+
     try:
     try:
-        file_object = open(file, 'r')
+        file_object = open(file, 'r', errors='ignore')
     except IOError:
         # file doesn't exist
         return lines
     except IOError:
         # file doesn't exist
         return lines
@@ -736,7 +759,7 @@ def grep_file(file, head, tail, after_context, before_context, count, regexp, hi
             before_context, after_context = after_context, before_context
 
         if before_context:
             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
             before_context_range.reverse()
 
         limit = tail or head
@@ -800,7 +823,7 @@ def grep_file(file, head, tail, after_context, before_context, count, regexp, hi
                     while id < after_context + offset:
                         id += 1
                         try:
                     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
                             _context_line = check(context_line)
                             if _context_line:
                                 offset = id
@@ -881,8 +904,7 @@ def grep_buffer(buffer, head, tail, after_context, before_context, count, regexp
         check = lambda s: check_string(s, regexp, hilight, exact)
 
     if before_context:
         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)
 
     while infolist_next(infolist):
         line = get_line(infolist)
@@ -980,7 +1002,7 @@ def show_matching_lines():
             buffer_update()
         else:
             global hook_file_grep, grep_stdout, grep_stderr, pattern_tmpl
             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,
             hook_file_grep = weechat.hook_process(
                 'func:grep_process',
                 get_config_int('timeout_secs') * 1000,
@@ -1002,17 +1024,20 @@ def grep_process(*args):
         global grep_options, log_pairs
         for log_name, log in log_pairs:
             result[log_name] = grep_file(log, *grep_options)
         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
 
         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
 
 
 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
     grep_stdout += out
+
+    if isinstance(err, str):
+        err = err.encode()
     grep_stderr += err
 
     def set_buffer_error(message):
     grep_stderr += err
 
     def set_buffer_error(message):
@@ -1038,7 +1063,7 @@ def grep_process_cb(data, command, return_code, out, err):
             if isinstance(data, Exception):
                 raise data
             matched_lines.update(data)
             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:
             set_buffer_error(repr(e))
             return WEECHAT_RC_OK
         else:
@@ -1180,7 +1205,7 @@ def buffer_update():
 
     # free matched_lines so it can be removed from memory
     del matched_lines
 
     # 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
 def split_line(s):
     """Splits log's line 's' in 3 parts, date, nick and msg."""
     global weechat_format
@@ -1280,12 +1305,12 @@ def buffer_input(data, buffer, input_data):
                 weechat.infolist_free(infolist)
             try:
                 cmd_grep_parsing(input_data)
                 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()
                 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)
                 error(e)
     except NameError:
         error("There isn't any previous search to repeat.", buffer=buffer)
@@ -1342,11 +1367,11 @@ def cmd_grep_parsing(args):
 
     args = ' '.join(args) # join pattern for keep spaces
     if args:
 
     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:
         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:
 
     def positive_number(opt, val):
         try:
@@ -1359,7 +1384,7 @@ def cmd_grep_parsing(args):
                 opt = '-' + opt
             else:
                 opt = '--' + opt
                 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('-')
 
     for opt, val in opts:
         opt = opt.strip('-')
@@ -1454,8 +1479,8 @@ def cmd_grep(data, buffer, args):
     # parse
     try:
         cmd_grep_parsing(args)
     # 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
         return WEECHAT_RC_OK
 
     # find logs
@@ -1501,7 +1526,7 @@ def cmd_grep(data, buffer, args):
     # grepping
     try:
         show_matching_lines()
     # grepping
     try:
         show_matching_lines()
-    except Exception, e:
+    except Exception as e:
         error(e)
     return WEECHAT_RC_OK
 
         error(e)
     return WEECHAT_RC_OK
 
@@ -1520,8 +1545,8 @@ def cmd_logs(data, buffer, args):
             opt = opt.strip('-')
             if opt in ('size', 's'):
                 sort_by_size = True
             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
         return WEECHAT_RC_OK
 
     # is there's a filter, filter_excludes should be False
@@ -1544,7 +1569,7 @@ def cmd_logs(data, buffer, args):
     buffer = buffer_create()
     if get_config_boolean('clear_buffer'):
         weechat.buffer_clear(buffer)
     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)
     msg = 'Found %s logs.' %len(file_list)
 
     print_line(msg, buffer, display=True)
@@ -1703,7 +1728,7 @@ Examples:
             'completion_grep_args', '')
 
     # settings
             '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)
 
         if not weechat.config_is_set_plugin(opt):
             weechat.config_set_plugin(opt, val)
 
@@ -1716,7 +1741,7 @@ Examples:
     color_summary     = weechat.color('lightcyan')
     color_delimiter   = weechat.color('chat_delimiters')
     color_script_nick = weechat.color('chat_nick')
     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)
     # pretty [grep]
     script_nick = '%s[%s%s%s]%s' %(color_delimiter, color_script_nick, SCRIPT_NAME, color_delimiter,
             color_reset)
@@ -1734,8 +1759,11 @@ Examples:
             debug = pybuffer.debugBuffer(globals(), '%s_debug' % SCRIPT_NAME)
         except:
             def debug(s, *args):
             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))
                 if args:
                     s = s %args
                 prnt('', '%s\t%s' %(script_nick, s))