Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: abp/filters/diff_script.py

Issue 29922555: Issue 7059 - Modify fldiff so it can handle multiple files (Closed) Base URL: https://hg.adblockplus.org/python-abp
Patch Set: Address comments on PS1 Created Oct. 26, 2018, 9:40 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 # This file is part of Adblock Plus <https://adblockplus.org/>, 1 # This file is part of Adblock Plus <https://adblockplus.org/>,
2 # Copyright (C) 2006-present eyeo GmbH 2 # Copyright (C) 2006-present eyeo GmbH
3 # 3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify 4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as 5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation. 6 # published by the Free Software Foundation.
7 # 7 #
8 # Adblock Plus is distributed in the hope that it will be useful, 8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details. 11 # GNU General Public License for more details.
12 # 12 #
13 # You should have received a copy of the GNU General Public License 13 # You should have received a copy of the GNU General Public License
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
15 15
16 """Command line script for rendering Adblock Plus filter list diffs.""" 16 """Command line script for rendering Adblock Plus filter list diffs."""
17 17
18 from __future__ import print_function 18 from __future__ import print_function
19 19
20 import argparse 20 import argparse
21 import io 21 import io
22 import sys 22 import sys
23 import os
23 24
24 from .renderer import render_diff 25 from .renderer import render_diff
26 from .parser import parse_filterlist
25 27
26 __all__ = ['main'] 28 __all__ = ['main']
27 29
28 30
29 def parse_args(): 31 class MissingFilterListError(Exception):
30 parser = argparse.ArgumentParser(description='Render a filter list diff.') 32 """Error in finding a latest filter list, or base filter lists."""
31 parser.add_argument(
32 'base', help='the older filter list that needs to be updated',
33 nargs='?')
34 parser.add_argument(
35 'latest', help='the most recent version of the filter list',
36 nargs='?')
37 parser.add_argument(
38 'outfile', help='output file for filter list diff',
39 default='-', nargs='?')
40 return parser.parse_args()
41 33
42 34
43 def main(): 35 def _get_version(filterlist):
36 for line in parse_filterlist(filterlist):
37 if line.type == 'header':
38 base = line.version
39 if line.type == 'metadata' and line.key == 'Version':
40 return line.value
41 raise MissingFilterListError('Unable to find Version in [{}]'.format(base))
Vasily Kuznetsov 2018/10/29 16:31:48 Wouldn't it be more helpful to give filename in th
rhowell 2018/10/29 20:01:40 Yeah. With this (old) method, it returns the heade
42
43
44 def parse_args(args_in=None):
45 parser = argparse.ArgumentParser(description='Render a filter list diff.')
46 parser.add_argument('latest',
47 help='The most recent version of the filter list')
48 parser.add_argument('-o', '--output_dir', default=os.getcwd(),
49 help='The directory to write the diffs to')
50 parser.add_argument('base_files', nargs='+',
51 help='One or more archived filter lists')
52 return parser.parse_args(args_in)
53
54
55 def main(args_in=None):
44 """Entry point for the diff rendering script (fldiff).""" 56 """Entry point for the diff rendering script (fldiff)."""
45 args = parse_args() 57 arg = parse_args(args_in)
46 58
47 with io.open(args.base, 'r', encoding='utf-8') as base, \ 59 with io.open(arg.latest, 'r', encoding='utf8') as latest_list:
48 io.open(args.latest, 'r', encoding='utf-8') as latest: 60 latest = latest_list.readlines()
49 61
50 lines = render_diff(base, latest) 62 for base_file in arg.base_files:
51 if args.outfile == '-': 63 with io.open(base_file, 'r', encoding='utf8') as base_file:
52 outfile = io.open(sys.stdout.fileno(), 'w', 64 base = base_file.readlines()
53 closefd=False, 65 lines = render_diff(base, latest)
54 encoding=sys.stdout.encoding or 'utf-8') 66 try:
55 else: 67 version = _get_version(base)
56 outfile = io.open(args.outfile, 'w', encoding='utf-8') 68 except MissingFilterListError as exc:
69 sys.exit(exc)
57 70
58 with outfile: 71 # TODO: After removing the dict test, this .strip() can go
59 for line in lines: 72 outfile = os.path.join(arg.output_dir.strip(),
60 print(line, file=outfile) 73 'diff{}.txt'.format(version))
74
75 with io.open(outfile, 'w', encoding='utf-8') as out_fp:
76 for line in lines:
77 out_fp.write(line + '\n')
OLDNEW
« no previous file with comments | « README.md ('k') | tests/test_diff_script.py » ('j') | tests/test_diff_script.py » ('J')

Powered by Google App Engine
This is Rietveld