• L
    Fix '--dirstat' with cross-directory renaming · 441bca0b
    Linus Torvalds 提交于
    The dirstat code depends on the fact that we always generate diffs with
    the names sorted, since it then just does a single-pass walk-over of the
    sorted list of names and how many changes there were. The sorting means
    that all files are nicely grouped by directory.
    
    That all works fine.
    
    Except when we have rename detection, and suddenly the nicely sorted list
    of pathnames isn't all that sorted at all. And now the single-pass dirstat
    walk gets all confused, and you can get results like this:
    
      [torvalds@nehalem linux]$ git diff --dirstat=2 -M v2.6.27-rc4..v2.6.27-rc5
         3.0% arch/powerpc/configs/
         6.8% arch/arm/configs/
         2.7% arch/powerpc/configs/
         4.2% arch/arm/configs/
         5.6% arch/powerpc/configs/
         8.4% arch/arm/configs/
         5.5% arch/powerpc/configs/
        23.3% arch/arm/configs/
         8.6% arch/powerpc/configs/
         4.0% arch/
         4.4% drivers/usb/musb/
         4.0% drivers/watchdog/
         7.6% drivers/
         3.5% fs/
    
    The trivial fix is to add a sorting pass, fixing it to:
    
      [torvalds@nehalem linux]$ git diff --dirstat=2 -M v2.6.27-rc4..v2.6.27-rc5
        43.0% arch/arm/configs/
        25.5% arch/powerpc/configs/
         5.3% arch/
         4.4% drivers/usb/musb/
         4.0% drivers/watchdog/
         7.6% drivers/
         3.5% fs/
    
    Spot the difference. In case anybody wonders: it's because of a ton of
    renames from {include/asm-blackfin => arch/blackfin/include/asm} that just
    totally messed up the file ordering in between arch/arm and arch/powerpc.
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    441bca0b
diff.c 89.0 KB