| Index: third_party/pylint/checkers/similar.py
 | 
| diff --git a/third_party/pylint/checkers/similar.py b/third_party/pylint/checkers/similar.py
 | 
| index e5c930038c8f57eb1b09244f5b8b87ad3271f1ad..013f1b0f698b4cc0e4e1a3c8e7b8be7bfaa6290f 100644
 | 
| --- a/third_party/pylint/checkers/similar.py
 | 
| +++ b/third_party/pylint/checkers/similar.py
 | 
| @@ -16,14 +16,18 @@
 | 
|  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 | 
|  """a similarities / code duplication command line tool and pylint checker
 | 
|  """
 | 
| +from __future__ import print_function
 | 
|  import sys
 | 
| -from itertools import izip
 | 
| +from collections import defaultdict
 | 
|  
 | 
|  from logilab.common.ureports import Table
 | 
|  
 | 
|  from pylint.interfaces import IRawChecker
 | 
|  from pylint.checkers import BaseChecker, table_lines_from_stats
 | 
|  
 | 
| +import six
 | 
| +from six.moves import zip
 | 
| +
 | 
|  
 | 
|  class Similar(object):
 | 
|      """finds copy-pasted lines of code in a project"""
 | 
| @@ -58,9 +62,9 @@ class Similar(object):
 | 
|  
 | 
|      def _compute_sims(self):
 | 
|          """compute similarities in appended files"""
 | 
| -        no_duplicates = {}
 | 
| +        no_duplicates = defaultdict(list)
 | 
|          for num, lineset1, idx1, lineset2, idx2 in self._iter_sims():
 | 
| -            duplicate = no_duplicates.setdefault(num, [])
 | 
| +            duplicate = no_duplicates[num]
 | 
|              for couples in duplicate:
 | 
|                  if (lineset1, idx1) in couples or (lineset2, idx2) in couples:
 | 
|                      couples.add((lineset1, idx1))
 | 
| @@ -69,7 +73,7 @@ class Similar(object):
 | 
|              else:
 | 
|                  duplicate.append(set([(lineset1, idx1), (lineset2, idx2)]))
 | 
|          sims = []
 | 
| -        for num, ensembles in no_duplicates.iteritems():
 | 
| +        for num, ensembles in six.iteritems(no_duplicates):
 | 
|              for couples in ensembles:
 | 
|                  sims.append((num, couples))
 | 
|          sims.sort()
 | 
| @@ -80,19 +84,19 @@ class Similar(object):
 | 
|          """display computed similarities on stdout"""
 | 
|          nb_lignes_dupliquees = 0
 | 
|          for num, couples in sims:
 | 
| -            print
 | 
| -            print num, "similar lines in", len(couples), "files"
 | 
| +            print()
 | 
| +            print(num, "similar lines in", len(couples), "files")
 | 
|              couples = sorted(couples)
 | 
|              for lineset, idx in couples:
 | 
| -                print "==%s:%s" % (lineset.name, idx)
 | 
| +                print("==%s:%s" % (lineset.name, idx))
 | 
|              # pylint: disable=W0631
 | 
|              for line in lineset._real_lines[idx:idx+num]:
 | 
| -                print "  ", line.rstrip()
 | 
| +                print("  ", line.rstrip())
 | 
|              nb_lignes_dupliquees += num * (len(couples)-1)
 | 
|          nb_total_lignes = sum([len(lineset) for lineset in self.linesets])
 | 
| -        print "TOTAL lines=%s duplicates=%s percent=%.2f" \
 | 
| +        print("TOTAL lines=%s duplicates=%s percent=%.2f" \
 | 
|              % (nb_total_lignes, nb_lignes_dupliquees,
 | 
| -               nb_lignes_dupliquees*100. / nb_total_lignes)
 | 
| +               nb_lignes_dupliquees*100. / nb_total_lignes))
 | 
|  
 | 
|      def _find_common(self, lineset1, lineset2):
 | 
|          """find similarities in the two given linesets"""
 | 
| @@ -107,7 +111,7 @@ class Similar(object):
 | 
|              for index2 in find(lineset1[index1]):
 | 
|                  non_blank = 0
 | 
|                  for num, ((_, line1), (_, line2)) in enumerate(
 | 
| -                        izip(lines1(index1), lines2(index2))):
 | 
| +                        zip(lines1(index1), lines2(index2))):
 | 
|                      if line1 != line2:
 | 
|                          if non_blank > min_lines:
 | 
|                              yield num, lineset1, index1, lineset2, index2
 | 
| @@ -207,10 +211,10 @@ class LineSet(object):
 | 
|  
 | 
|      def _mk_index(self):
 | 
|          """create the index for this set"""
 | 
| -        index = {}
 | 
| +        index = defaultdict(list)
 | 
|          for line_no, line in enumerate(self._stripped_lines):
 | 
|              if line:
 | 
| -                index.setdefault(line, []).append(line_no)
 | 
| +                index[line].append(line_no)
 | 
|          return index
 | 
|  
 | 
|  
 | 
| @@ -323,10 +327,10 @@ def register(linter):
 | 
|  
 | 
|  def usage(status=0):
 | 
|      """display command line usage information"""
 | 
| -    print "finds copy pasted blocks in a set of files"
 | 
| -    print
 | 
| -    print 'Usage: symilar [-d|--duplicates min_duplicated_lines] \
 | 
| -[-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] file1...'
 | 
| +    print("finds copy pasted blocks in a set of files")
 | 
| +    print()
 | 
| +    print('Usage: symilar [-d|--duplicates min_duplicated_lines] \
 | 
| +[-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] file1...')
 | 
|      sys.exit(status)
 | 
|  
 | 
|  def Run(argv=None):
 | 
| 
 |