1. 05 1月, 2008 2 次提交
    • J
      diff: load funcname patterns in "basic" config · e467193f
      Jeff King 提交于
      The funcname patterns influence the "comment" on @@ lines of
      the diff. They are safe to use with plumbing since they
      don't fundamentally change the meaning of the diff in any
      way.
      
      Since all diff users call either diff_ui_config or
      diff_basic_config, we can get rid of the lazy reading of the
      config.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e467193f
    • J
      add a "basic" diff config callback · 9a1805a8
      Jeff King 提交于
      The diff porcelain uses git_diff_ui_config to set
      porcelain-ish config options, like automatically turning on
      color. The plumbing specifically avoids calling this
      function, since it doesn't want things like automatic color
      or rename detection.
      
      However, some diff options should be set for both plumbing
      and porcelain. For example, one can still turn on color in
      git-diff-files using the --color command line option. This
      means we want the color config from color.diff.* (so that
      once color is on, we use the user's preferred scheme), but
      _not_ the color.diff variable.
      
      We split the diff config into "ui" and "basic", where
      "basic" is suitable for use by plumbing (so _most_ things
      affecting the output should still go into the "ui" part).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9a1805a8
  2. 27 12月, 2007 1 次提交
  3. 20 12月, 2007 1 次提交
  4. 18 12月, 2007 1 次提交
  5. 14 12月, 2007 5 次提交
    • W
      Make "diff --check" output match "git apply" · 45e2a4b2
      Wincent Colaiuta 提交于
      For consistency, make the two tools report whitespace errors in the
      same way (the output of "diff --check" has been tweaked to match
      that of "git apply").
      
      Note that although the textual content is basically the same only
      "git diff --check" provides a colorized version of the problematic
      lines; making "git apply" do colorization will require more extensive
      changes (figuring out the diff colorization preferences of the user)
      and so that will be a subject for another commit.
      Signed-off-by: NWincent Colaiuta <win@wincent.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      45e2a4b2
    • W
      Unify whitespace checking · c1795bb0
      Wincent Colaiuta 提交于
      This commit unifies three separate places where whitespace checking was
      performed:
      
       - the whitespace checking previously done in builtin-apply.c is
      extracted into a function in ws.c
      
       - the equivalent logic in "git diff" is removed
      
       - the emit_line_with_ws() function is also removed because that also
      rechecks the whitespace, and its functionality is rolled into ws.c
      
      The new function is called check_and_emit_line() and it does two things:
      checks a line for whitespace errors and optionally emits it. The checking
      is based on lines of content rather than patch lines (in other words, the
      caller must strip the leading "+" or "-"); this was suggested by Junio on
      the mailing list to allow for a future extension to "git show" to display
      whitespace errors in blobs.
      
      At the same time we teach it to report all classes of whitespace errors
      found for a given line rather than reporting only the first found error.
      Signed-off-by: NWincent Colaiuta <win@wincent.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c1795bb0
    • J
      diff --check: minor fixups · da31b358
      Junio C Hamano 提交于
      There is no reason --exit-code and --check-diff must be mutually
      exclusive, so assign different bits to different results and allow them
      to be returned from the command.  Introduce diff_result_code() to factor
      out the common code to decide final status code based on diffopt
      settings and use it everywhere.
      
      Update tests to match the above fix.
      
      Turning pager off when "diff --check" is used is a regression.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      da31b358
    • W
      "diff --check" should affect exit status · 62c64895
      Wincent Colaiuta 提交于
      "git diff" has a --check option that can be used to check for whitespace
      problems but it only reported by printing warnings to the
      console.
      
      Now when the --check option is used we give a non-zero exit status,
      making "git diff --check" nicer to use in scripts and hooks.
      Signed-off-by: NWincent Colaiuta <win@wincent.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      62c64895
    • J
      xdl_diff: identify call sites. · c279d7e9
      Junio C Hamano 提交于
      This inserts a new function xdi_diff() that currently does not
      do anything other than calling the underlying xdl_diff() to the
      callchain of current callers of xdl_diff() function.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c279d7e9
  6. 13 12月, 2007 3 次提交
    • W
      Fix "diff --check" whitespace detection · 86f8c236
      Wincent Colaiuta 提交于
      "diff --check" would only detect spaces before tabs if a tab was the
      last character in the leading indent. Fix that and add a test case to
      make sure the bug doesn't regress in the future.
      Signed-off-by: NWincent Colaiuta <win@wincent.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      86f8c236
    • J
      git-diff --numstat -z: make it machine readable · f604652e
      Junio C Hamano 提交于
      The "-z" format is all about machine parsability, but showing renamed
      paths as "common/{a => b}/suffix" makes it impossible.  The scripts would
      never have successfully parsed "--numstat -z -M" in the old format.
      
      This fixes the output format in a (hopefully minimally) backward
      incompatible way.
      
       * The output without -z is not changed.  This has given a good way for
         humans to view added and deleted lines separately, and showing the
         path in combined, shorter way would preserve readability.
      
       * The output with -z is unchanged for paths that do not involve renames.
         Existing scripts that do not pass -M/-C are not affected at all.
      
       * The output with -z for a renamed path is shown in a format that can
         easily be distinguished from an unrenamed path.
      
      This is based on Jakub Narebski's patch.  Bugs and documentation typos
      are mine.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f604652e
    • W
      Use "whitespace" consistently · 0ac7903e
      Wincent Colaiuta 提交于
      For consistency, change "white space" and "whitespaces" to
      "whitespace", fixing a couple of adjacent grammar problems in the
      docs.
      Signed-off-by: NWincent Colaiuta <win@wincent.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0ac7903e
  7. 06 12月, 2007 2 次提交
    • J
      Use gitattributes to define per-path whitespace rule · cf1b7869
      Junio C Hamano 提交于
      The `core.whitespace` configuration variable allows you to define what
      `diff` and `apply` should consider whitespace errors for all paths in
      the project (See gitlink:git-config[1]).  This attribute gives you finer
      control per path.
      
      For example, if you have these in the .gitattributes:
      
          frotz   whitespace
          nitfol  -whitespace
          xyzzy   whitespace=-trailing
      
      all types of whitespace problems known to git are noticed in path 'frotz'
      (i.e. diff shows them in diff.whitespace color, and apply warns about
      them), no whitespace problem is noticed in path 'nitfol', and the
      default types of whitespace problems except "trailing whitespace" are
      noticed for path 'xyzzy'.  A project with mixed Python and C might want
      to have:
      
          *.c    whitespace
          *.py   whitespace=-indent-with-non-tab
      
      in its toplevel .gitattributes file.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cf1b7869
    • J
      git config --get-colorbool · 0f6f5a40
      Junio C Hamano 提交于
      This adds an option to help scripts find out color settings from
      the configuration file.
      
          git config --get-colorbool color.diff
      
      inspects color.diff variable, and exits with status 0 (i.e. success) if
      color is to be used.  It exits with status 1 otherwise.
      
      If a script wants "true"/"false" answer to the standard output of the
      command, it can pass an additional boolean parameter to its command
      line, telling if its standard output is a terminal, like this:
      
          git config --get-colorbool color.diff true
      
      When called like this, the command outputs "true" to its standard output
      if color is to be used (i.e. "color.diff" says "always", "auto", or
      "true"), and "false" otherwise.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0f6f5a40
  8. 22 11月, 2007 1 次提交
  9. 12 11月, 2007 2 次提交
  10. 03 11月, 2007 2 次提交
    • J
      git-diff: complain about >=8 consecutive spaces in initial indent · 459fa6d0
      Junio C Hamano 提交于
      This introduces a new whitespace error type, "indent-with-non-tab".
      The error is about starting a line with 8 or more SP, instead of
      indenting it with a HT.
      
      This is not enabled by default, as some projects employ an
      indenting policy to use only SPs and no HTs.
      
      The kernel folks and git contributors may want to enable this
      detection with:
      
      	[core]
      		whitespace = indent-with-non-tab
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      459fa6d0
    • J
      War on whitespace: first, a bit of retreat. · a9cc857a
      Junio C Hamano 提交于
      This introduces core.whitespace configuration variable that lets
      you specify the definition of "whitespace error".
      
      Currently there are two kinds of whitespace errors defined:
      
       * trailing-space: trailing whitespaces at the end of the line.
      
       * space-before-tab: a SP appears immediately before HT in the
         indent part of the line.
      
      You can specify the desired types of errors to be detected by
      listing their names (unique abbreviations are accepted)
      separated by comma.  By default, these two errors are always
      detected, as that is the traditional behaviour.  You can disable
      detection of a particular type of error by prefixing a '-' in
      front of the name of the error, like this:
      
      	[core]
      		whitespace = -trailing-space
      
      This patch teaches the code to output colored diff with
      DIFF_WHITESPACE color to highlight the detected whitespace
      errors to honor the new configuration.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a9cc857a
  11. 27 10月, 2007 2 次提交
    • L
      copy vs rename detection: avoid unnecessary O(n*m) loops · 64479711
      Linus Torvalds 提交于
      The core rename detection had some rather stupid code to check if a
      pathname was used by a later modification or rename, which basically
      walked the whole pathname space for all renames for each rename, in
      order to tell whether it was a pure rename (no remaining users) or
      should be considered a copy (other users of the source file remaining).
      
      That's really silly, since we can just keep a count of users around, and
      replace all those complex and expensive loops with just testing that
      simple counter (but this all depends on the previous commit that shared
      the diff_filespec data structure by using a separate reference count).
      
      Note that the reference count is not the same as the rename count: they
      behave otherwise rather similarly, but the reference count is tied to
      the allocation (and decremented at de-allocation, so that when it turns
      zero we can get rid of the memory), while the rename count is tied to
      the renames and is decremented when we find a rename (so that when it
      turns zero we know that it was a rename, not a copy).
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      64479711
    • L
      Ref-count the filespecs used by diffcore · 9fb88419
      Linus Torvalds 提交于
      Rather than copy the filespecs when introducing new versions of them
      (for rename or copy detection), use a refcount and increment the count
      when reusing the diff_filespec.
      
      This avoids unnecessary allocations, but the real reason behind this is
      a future enhancement: we will want to track shared data across the
      copy/rename detection.  In order to efficiently notice when a filespec
      is used by a rename, the rename machinery wants to keep track of a
      rename usage count which is shared across all different users of the
      filespec.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9fb88419
  12. 22 10月, 2007 1 次提交
  13. 21 10月, 2007 1 次提交
  14. 03 10月, 2007 2 次提交
    • J
    • J
      diffcore-rename: cache file deltas · eede7b7d
      Jeff King 提交于
      We find rename candidates by computing a fingerprint hash of
      each file, and then comparing those fingerprints. There are
      inherently O(n^2) comparisons, so it pays in CPU time to
      hoist the (rather expensive) computation of the fingerprint
      out of that loop (or to cache it once we have computed it once).
      
      Previously, we didn't keep the filespec information around
      because then we had the potential to consume a great deal of
      memory. However, instead of keeping all of the filespec
      data, we can instead just keep the fingerprint.
      
      This patch implements and uses diff_free_filespec_data_large
      to accomplish that goal. We also have to change
      estimate_similarity not to needlessly repopulate the
      filespec data when we already have the hash.
      
      Practical tests showed 4.5x speedup for a 10% memory usage
      increase.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      eede7b7d
  15. 29 9月, 2007 1 次提交
    • P
      strbuf change: be sure ->buf is never ever NULL. · b315c5c0
      Pierre Habouzit 提交于
      For that purpose, the ->buf is always initialized with a char * buf living
      in the strbuf module. It is made a char * so that we can sloppily accept
      things that perform: sb->buf[0] = '\0', and because you can't pass "" as an
      initializer for ->buf without making gcc unhappy for very good reasons.
      
      strbuf_init/_detach/_grow have been fixed to trust ->alloc and not ->buf
      anymore.
      
      as a consequence strbuf_detach is _mandatory_ to detach a buffer, copying
      ->buf isn't an option anymore, if ->buf is going to escape from the scope,
      and eventually be free'd.
      
      API changes:
        * strbuf_setlen now always works, so just make strbuf_reset a convenience
          macro.
        * strbuf_detatch takes a size_t* optional argument (meaning it can be
          NULL) to copy the buffer's len, as it was needed for this refactor to
          make the code more readable, and working like the callers.
      Signed-off-by: NPierre Habouzit <madcoder@debian.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b315c5c0
  16. 26 9月, 2007 1 次提交
    • J
      diffcore-rename: cache file deltas · a5a3878b
      Jeff King 提交于
      We find rename candidates by computing a fingerprint hash of
      each file, and then comparing those fingerprints. There are
      inherently O(n^2) comparisons, so it pays in CPU time to
      hoist the (rather expensive) computation of the fingerprint
      out of that loop (or to cache it once we have computed it once).
      
      Previously, we didn't keep the filespec information around
      because then we had the potential to consume a great deal of
      memory. However, instead of keeping all of the filespec
      data, we can instead just keep the fingerprint.
      
      This patch implements and uses diff_free_filespec_data_large
      to accomplish that goal. We also have to change
      estimate_similarity not to needlessly repopulate the
      filespec data when we already have the hash.
      
      Practical tests showed 4.5x speedup for a 10% memory usage
      increase.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a5a3878b
  17. 21 9月, 2007 1 次提交
    • P
      Full rework of quote_c_style and write_name_quoted. · 663af342
      Pierre Habouzit 提交于
      * quote_c_style works on a strbuf instead of a wild buffer.
      * quote_c_style is now clever enough to not add double quotes if not needed.
      
      * write_name_quoted inherits those advantages, but also take a different
        set of arguments. Now instead of asking for quotes or not, you pass a
        "terminator". If it's \0 then we assume you don't want to escape, else C
        escaping is performed. In any case, the terminator is also appended to the
        stream. It also no longer takes the prefix/prefix_len arguments, as it's
        seldomly used, and makes some optimizations harder.
      
      * write_name_quotedpfx is created to work like write_name_quoted and take
        the prefix/prefix_len arguments.
      
      Thanks to those API changes, diff.c has somehow lost weight, thanks to the
      removal of functions that were wrappers around the old write_name_quoted
      trying to give it a semantics like the new one, but performing a lot of
      allocations for this goal. Now we always write directly to the stream, no
      intermediate allocation is performed.
      
      As a side effect of the refactor in builtin-apply.c, the length of the bar
      graphs in diffstats are not affected anymore by the fact that the path was
      clipped.
      Signed-off-by: NPierre Habouzit <madcoder@debian.org>
      663af342
  18. 19 9月, 2007 1 次提交
  19. 17 9月, 2007 2 次提交
  20. 15 9月, 2007 1 次提交
    • L
      Fix the rename detection limit checking · 0024a549
      Linus Torvalds 提交于
      This adds more proper rename detection limits. Instead of just checking
      the limit against the number of potential rename destinations, we verify
      that the rename matrix (which is what really matters) doesn't grow
      ridiculously large, and we also make sure that we don't overflow when
      doing the matrix size calculation.
      
      This also changes the default limits from unlimited, to a rename matrix
      that is limited to 100 entries on a side. You can raise it with the config
      entry, or by using the "-l<n>" command line flag, but at least the default
      is now a sane number that avoids spending lots of time (and memory) in
      situations that likely don't merit it.
      
      The choice of default value is of course very debatable. Limiting the
      rename matrix to a 100x100 size will mean that even if you have just one
      obvious rename, but you also create (or delete) 10,000 files, the rename
      matrix will be so big that we disable the heuristics. Sounds reasonable to
      me, but let's see if people hit this (and, perhaps more importantly,
      actually *care*) in real life.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0024a549
  21. 11 9月, 2007 1 次提交
    • P
      Strbuf API extensions and fixes. · f1696ee3
      Pierre Habouzit 提交于
        * Add strbuf_rtrim to remove trailing spaces.
        * Add strbuf_insert to insert data at a given position.
        * Off-by one fix in strbuf_addf: strbuf_avail() does not counts the final
          \0 so the overflow test for snprintf is the strict comparison. This is
          not critical as the growth mechanism chosen will always allocate _more_
          memory than asked, so the second test will not fail. It's some kind of
          miracle though.
        * Add size extension hints for strbuf_init and strbuf_read. If 0, default
          applies, else:
            + initial buffer has the given size for strbuf_init.
            + first growth checks it has at least this size rather than the
              default 8192.
      Signed-off-by: NPierre Habouzit <madcoder@debian.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f1696ee3
  22. 09 9月, 2007 1 次提交
  23. 07 9月, 2007 1 次提交
  24. 01 9月, 2007 1 次提交
    • J
      git-diff: resurrect the traditional empty "diff --git" behaviour · aecbf914
      Junio C Hamano 提交于
      The warning message to suggest "Consider running git-status" from
      "git-diff" that we experimented with during the 1.5.3 cycle turns
      out to be a bad idea.  It robbed cache-dirty information from people
      who valued it, while still asking users to run "update-index --refresh".
      It was hoped that the new behaviour would at least have some educational
      value, but not showing the cache-dirty paths like before meant that the
      user would not even know easily which paths were cache-dirty, and it
      made the need to refresh the index look like even more unnecessary chore.
      
      This commit reinstates the traditional behaviour, but with a twist.
      
      By default, the empty "diff --git" output is totally squelched out
      from "git diff" output.  At the end of the command, it automatically
      runs "update-index --refresh" as needed, without even bothering the
      user.  In other words, people who do not care about the cache-dirtyness
      do not even have to see the warning.
      
      The traditional behaviour to see the stat-dirty output and to bypassing
      the overhead of content comparison can be specified by setting the
      configuration variable diff.autorefreshindex to false.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      aecbf914
  25. 20 8月, 2007 1 次提交
  26. 15 8月, 2007 1 次提交
    • R
      diff: squelch empty diffs even more · 6d2d9e86
      René Scharfe 提交于
      When we compare two non-tracked files, or explicitly
      specify --no-index, the suggestion to run git-status
      is not helpful.
      
      The patch adds a new diff_options bitfield member, no_index, that
      is used instead of the special value of -2 of the rev_info field
      max_count to indicate that the index is not to be used.  This makes
      it possible to pass that flag down to diffcore_skip_stat_unmatch(),
      which only has one diff_options parameter.
      
      This could even become a cleanup if we removed all assignments of
      max_count to a value of -2 (viz. replacement of a magic value with
      a self-documenting field name) but I didn't dare to do that so late
      in the rc game..
      
      The no_index bit, if set, then tells diffcore_skip_stat_unmatch()
      to not account for any skipped stat-mismatches, which avoids the
      suggestion to run git-status.
      Signed-off-by: NRene Scharfe <rene.scharfe@lsfire.ath.cx>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6d2d9e86
  27. 14 8月, 2007 1 次提交
    • J
      git-diff: squelch "empty" diffs · fb13227e
      Junio C Hamano 提交于
      After starting to edit a working tree file but later when your edit ends
      up identical to the original (this can also happen when you ran a
      wholesale regexp replace with something like "perl -i" that does not
      actually modify many of the paths), "git diff" between the index and the
      working tree outputs many "empty" diffs that show "diff --git" headers
      and nothing else, because these paths are stat-dirty.  While it was a
      way to warn the user that the earlier action of the user made the index
      ineffective as an optimization mechanism, it was felt too loud for the
      purpose of warning even to experienced users, and also resulted in
      confusing people new to git.
      
      This replaces the "empty" diffs with a single warning message at the
      end.  Having many such paths hurts performance, and you can run
      "git-update-index --refresh" to update the lstat(2) information recorded
      in the index in such a case.  "git-status" does so as a side effect, and
      that is more familiar to the end-user, so we recommend it to them.
      
      The change affects only "git diff" that outputs patch text, because that
      is where the annoyance of too many "empty" diff is most strongly felt,
      and because the warning message can be safely ignored by downstream
      tools without getting mistaken as part of the patch.  For the low-level
      "git diff-files" and "git diff-index", the traditional behaviour is
      retained.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fb13227e