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

Side by Side Diff: abp/create_diff.py

Issue 29845767: Issue 6685 - Offer incremental filter list downloads (Closed) Base URL: https://hg.adblockplus.org/python-abp/
Patch Set: Created Aug. 3, 2018, 1:58 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/test_differ.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # This file is part of the Adblock Plus web scripts,
2 # Copyright (C) 2006-present eyeo GmbH
3 #
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
6 # published by the Free Software Foundation.
7 #
8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
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/>.
15
16 """Generate a diff between two filter lists."""
17
18 import re
19 import difflib
20 import hashlib
21 import base64
22
23
24 def generate_diff(base, latest):
25 """Return a diff between two filter lists."""
26 # Write the comments
27 diff = '[Adblock Plus Diff 2.0]\n'
28 sp_comment = re.compile(r'!\s(.*):\s(.*)')
29 a = []
30 b = []
31 ver = re.compile(r'(.*/)\d+(.txt)')
32 for line in latest.splitlines():
33 m = sp_comment.match(line)
34 if m:
35 if m.groups()[0] not in {'Checksum', 'Diff-URL'}:
36 diff += '! {}: {}\n'.format(m.groups()[0], m.groups()[1])
37 if m.groups()[0] == 'Version':
38 version = m.groups()[1]
39 if m.groups()[0] == 'Diff-URL':
40 url = ver.match(m.groups()[1])
41 diff += '! Diff-URL: {}{}{}\n'.format(url.groups()[0], version,
42 url.groups()[1])
43 elif not line.startswith('!'):
44 a.append(line.strip())
45
46 # Get the diff between the rest of the lines
47 for line in base.splitlines():
48 if not line.startswith('!'):
49 b.append(line.strip())
50 diffy = difflib.ndiff(b, a)
51 for item in diffy:
52 if item.startswith('+ ') or item.startswith('- '):
53 diff += item
54 diff += '\n'
55
56 # Add the checksum
57 md5sum = hashlib.md5()
58 for line in diff.splitlines():
59 if not line.strip():
60 md5sum.update(line.encode('utf-8') + b'\n')
61 checksum = base64.b64encode(md5sum.digest()).rstrip(b'=')
62 signed_diff = (diff[:24] +
63 '! Checksum: {}\n'.format(checksum.decode('utf-8')) +
64 diff[24:])
65 return signed_diff
66
67
68 def publish_diff(diff, outfile):
69 """Write the diff to the outfile."""
70 with open(outfile, 'w+') as outfile:
71 outfile.write(diff)
OLDNEW
« no previous file with comments | « no previous file | tests/test_differ.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld