1. 14 3月, 2010 1 次提交
  2. 09 3月, 2010 1 次提交
    • J
      git status: Show detailed dirty status of submodules in long format · 9297f77e
      Jens Lehmann 提交于
      Since 1.7.0 there are three reasons a submodule is considered modified
      against the work tree: It contains new commits, modified content or
      untracked content. Lets show all reasons in the long format of git status,
      so the user can better asses the nature of the modification. This change
      does not affect the short and porcelain formats.
      
      Two new members are added to "struct wt_status_change_data" to store the
      information gathered by run_diff_files(). wt-status.c uses the new flag
      DIFF_OPT_DIRTY_SUBMODULES to tell diff-lib.c it wants to get detailed
      dirty information about submodules.
      
      A hint line for submodules is printed in the dirty header when dirty
      submodules are present.
      Signed-off-by: NJens Lehmann <Jens.Lehmann@web.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9297f77e
  3. 19 1月, 2010 1 次提交
    • J
      Performance optimization for detection of modified submodules · e3d42c47
      Jens Lehmann 提交于
      In the worst case is_submodule_modified() got called three times for
      each submodule. The information we got from scanning the whole
      submodule tree the first time can be reused instead.
      
      New parameters have been added to diff_change() and diff_addremove(),
      the information is stored in a new member of struct diff_filespec. Its
      value is then reused instead of calling is_submodule_modified() again.
      
      When no explicit "-dirty" is needed in the output the call to
      is_submodule_modified() is not necessary when the submodules HEAD
      already disagrees with the ref of the superproject, as this alone
      marks it as modified. To achieve that, get_stat_data() got an extra
      argument.
      Signed-off-by: NJens Lehmann <Jens.Lehmann@web.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e3d42c47
  4. 08 1月, 2010 1 次提交
    • J
      unpack-trees.c: look ahead in the index · 730f7284
      Junio C Hamano 提交于
      This makes the traversal of index be in sync with the tree traversal.
      When unpack_callback() is fed a set of tree entries from trees, it
      inspects the name of the entry and checks if the an index entry with
      the same name could be hiding behind the current index entry, and
      
       (1) if the name appears in the index as a leaf node, it is also
           fed to the n_way_merge() callback function;
      
       (2) if the name is a directory in the index, i.e. there are entries in
           that are underneath it, then nothing is fed to the n_way_merge()
           callback function;
      
       (3) otherwise, if the name comes before the first eligible entry in the
           index, the index entry is first unpacked alone.
      
      When traverse_trees_recursive() descends into a subdirectory, the
      cache_bottom pointer is moved to walk index entries within that directory.
      
      All of these are omitted for diff-index, which does not even want to be
      fed an index entry and a tree entry with D/F conflicts.
      
      This fixes 3-way read-tree and exposes a bug in other parts of the system
      in t6035, test #5.  The test prepares these three trees:
      
       O = HEAD^
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b-2/c/d
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b/c/d
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/x
      
       A = HEAD
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b-2/c/d
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b/c/d
          100644 blob 587be6b4c3f93f93c489c0111bba5596147a26cb    a/x
      
       B = master
          120000 blob a36b77384451ea1de7bd340ffca868249626bc52    a/b
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b-2/c/d
          100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/x
      
      With a clean index that matches HEAD, running
      
          git read-tree -m -u --aggressive $O $A $B
      
      now yields
      
          120000 a36b77384451ea1de7bd340ffca868249626bc52 3       a/b
          100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       a/b-2/c/d
          100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 1       a/b/c/d
          100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 2       a/b/c/d
          100644 587be6b4c3f93f93c489c0111bba5596147a26cb 0       a/x
      
      which is correct.  "master" created "a/b" symlink that did not exist,
      and removed "a/b/c/d" while HEAD did not do touch either path.
      
      Before this series, read-tree did not notice the situation and resolved
      addition of "a/b" and removal of "a/b/c/d" independently.  If A = HEAD had
      another path "a/b/c/e" added, this merge should conflict but instead it
      silently resolved "a/b" and then immediately overwrote it to add
      "a/b/c/e", which was quite bogus.
      
      Tests in t1012 start to work with this.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      730f7284
  5. 29 11月, 2009 1 次提交
  6. 20 10月, 2009 1 次提交
  7. 30 7月, 2009 2 次提交
    • J
      diff: Rename QUIET internal option to QUICK · 90b19941
      Junio C Hamano 提交于
      The option "QUIET" primarily meant "find if we have _any_ difference as
      quick as possible and report", which means we often do not even have to
      look at blobs if we know the trees are different by looking at the higher
      level (e.g. "diff-tree A B").  As a side effect, because there is no point
      showing one change that we happened to have found first, it also enables
      NO_OUTPUT and EXIT_WITH_STATUS options, making the end result look quiet.
      
      Rename the internal option to QUICK to reflect this better; it also makes
      grepping the source tree much easier, as there are other kinds of QUIET
      option everywhere.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      90b19941
    • J
      diff: change semantics of "ignore whitespace" options · f245194f
      Junio C Hamano 提交于
      Traditionally, the --ignore-whitespace* options have merely meant to tell
      the diff output routine that some class of differences are not worth
      showing in the textual diff output, so that the end user has easier time
      to review the remaining (presumably more meaningful) changes.  These
      options never affected the outcome of the command, given as the exit
      status when the --exit-code option was in effect (either directly or
      indirectly).
      
      When you have only whitespace changes, however, you might expect
      
      	git diff -b --exit-code
      
      to report that there is _no_ change with zero exit status.
      
      Change the semantics of --ignore-whitespace* options to mean more than
      "omit showing the difference in text".
      
      The exit status, when --exit-code is in effect, is computed by checking if
      we found any differences at the path level, while diff frontends feed
      filepairs to the diffcore engine.  When "ignore whitespace" options are in
      effect, we defer this determination until the very end of diffcore
      transformation.  We simply do not know until the textual diff is
      generated, which comes very late in the pipeline.
      
      When --quiet is in effect, various diff frontends optimize by breaking out
      early from the loop that enumerates the filepairs, when we find the first
      path level difference; when --ignore-whitespace* is used the above change
      automatically disables this optimization.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f245194f
  8. 04 3月, 2009 1 次提交
  9. 11 2月, 2009 1 次提交
    • S
      Generalize and libify index_is_dirty() to index_differs_from(...) · 75f3ff2e
      Stephan Beyer 提交于
      index_is_dirty() in builtin-revert.c checks if the index is dirty.
      This patch generalizes this function to check if the index differs
      from a revision, i.e. the former index_is_dirty() behavior can now be
      achieved by index_differs_from("HEAD", 0).
      
      The second argument "diff_flags" allows to set further diff option
      flags like DIFF_OPT_IGNORE_SUBMODULES. See DIFF_OPT_* macros in diff.h
      for a list.
      
      index_differs_from() seems to be useful for more than builtin-revert.c,
      so it is moved into diff-lib.c and also used in builtin-commit.c.
      
      Yet to mention:
      
       - "rev.abbrev = 0;" can be safely removed.
         This has no impact on performance or functioning of neither
         setup_revisions() nor run_diff_index().
      
       - rev.pending.objects is free()d because this fixes a leak.
         (Also see 295dd2ad "Fix memory leak in traverse_commit_list")
      Mentored-by: NDaniel Barkalow <barkalow@iabervon.org>
      Mentored-by: NChristian Couder <chriscool@tuxfamily.org>
      Signed-off-by: NStephan Beyer <s-beyer@gmx.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      75f3ff2e
  10. 18 1月, 2009 1 次提交
  11. 29 12月, 2008 1 次提交
    • R
      diff: add option to show context between close hunks · 6d0e674a
      René Scharfe 提交于
      Merge two hunks if there is only the specified number of otherwise unshown
      context between them.  For --inter-hunk-context=1, the resulting patch has
      the same number of lines but shows uninterrupted context instead of a
      context header line in between.
      
      Patches generated with this option are easier to read but are also more
      likely to conflict if the file to be patched contains other changes.
      
      This patch keeps the default for this option at 0.  It is intended to just
      make the feature available in order to see its advantages and downsides.
      Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6d0e674a
  12. 27 10月, 2008 1 次提交
    • J
      userdiff: require explicitly allowing textconv · c7534ef4
      Jeff King 提交于
      Diffs that have been produced with textconv almost certainly
      cannot be applied, so we want to be careful not to generate
      them in things like format-patch.
      
      This introduces a new diff options, ALLOW_TEXTCONV, which
      controls this behavior. It is off by default, but is
      explicitly turned on for the "log" family of commands, as
      well as the "diff" porcelain (but not diff-* plumbing).
      
      Because both text conversion and external diffing are
      controlled by these diff options, we can get rid of the
      "plumbing versus porcelain" distinction when reading the
      config. This was an attempt to control the same thing, but
      suffered from being too coarse-grained.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c7534ef4
  13. 06 9月, 2008 1 次提交
  14. 04 9月, 2008 1 次提交
  15. 31 8月, 2008 1 次提交
    • J
      diff: vary default prefix depending on what are compared · a5a818ee
      Junio C Hamano 提交于
      With a new configuration "diff.mnemonicprefix", "git diff" shows the
      differences between various combinations of preimage and postimage trees
      with prefixes different from the standard "a/" and "b/".  Hopefully this
      will make the distinction stand out for some people.
      
          "git diff" compares the (i)ndex and the (w)ork tree;
          "git diff HEAD" compares a (c)ommit and the (w)ork tree;
          "git diff --cached" compares a (c)ommit and the (i)ndex;
          "git-diff HEAD:file1 file2" compares an (o)bject and a (w)ork tree entity;
          "git diff --no-index a b" compares two non-git things (1) and (2).
      
      Because these mnemonics now have meanings, they are swapped when reverse
      diff is in effect and this feature is enabled.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a5a818ee
  16. 17 7月, 2008 1 次提交
  17. 24 5月, 2008 1 次提交
    • J
      "git diff": do not ignore index without --no-index · 0569e9b8
      Junio C Hamano 提交于
      Even if "foo" and/or "bar" does not exist in index, "git diff foo bar"
      should not change behaviour drastically from "git diff foo bar baz" or
      "git diff foo".  A feature that "sometimes works and is handy" is an
      unreliable cute hack.
      
      "git diff foo bar" outside a git repository continues to work as a more
      colourful alternative to "diff -u" as before.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0569e9b8
  18. 16 5月, 2008 1 次提交
  19. 15 5月, 2008 1 次提交
  20. 04 5月, 2008 2 次提交
  21. 14 3月, 2008 1 次提交
  22. 18 2月, 2008 1 次提交
  23. 14 2月, 2008 1 次提交
    • J
      diff --relative: output paths as relative to the current subdirectory · cd676a51
      Junio C Hamano 提交于
      This adds --relative option to the diff family.  When you start
      from a subdirectory:
      
              $ git diff --relative
      
      shows only the diff that is inside your current subdirectory,
      and without $prefix part.  People who usually live in
      subdirectories may like it.
      
      There are a few things I should also mention about the change:
      
       - This works not just with diff but also works with the log
         family of commands, but the history pruning is not affected.
      
         In other words, if you go to a subdirectory, you can say:
      
              $ git log --relative -p
      
         but it will show the log message even for commits that do not
         touch the current directory.  You can limit it by giving
         pathspec yourself:
      
              $ git log --relative -p .
      
         This originally was not a conscious design choice, but we
         have a way to affect diff pathspec and pruning pathspec
         independently.  IOW "git log --full-diff -p ." tells it to
         prune history to commits that affect the current subdirectory
         but show the changes with full context.  I think it makes
         more sense to leave pruning independent from --relative than
         the obvious alternative of always pruning with the current
         subdirectory, which would break the symmetry.
      
       - Because this works also with the log family, you could
         format-patch a single change, limiting the effect to your
         subdirectory, like so:
      
              $ cd gitk-git
              $ git format-patch -1 --relative 911f1eb
      
         But because that is a special purpose usage, this option will
         never become the default, with or without repository or user
         preference configuration.  The risk of producing a partial
         patch and sending it out by mistake is too great if we did
         so.
      
       - This is inherently incompatible with --no-index, which is a
         bolted-on hack that does not have much to do with git
         itself.  I didn't bother checking and erroring out on the
         combined use of the options, but probably I should.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cd676a51
  24. 13 2月, 2008 1 次提交
    • L
      Add "--dirstat" for some directory statistics · 7df7c019
      Linus Torvalds 提交于
      This adds a new form of overview diffstat output, doing something that I
      have occasionally ended up doing manually (and badly, because it's
      actually pretty nasty to do), and that I think is very useful for an
      project like the kernel that has a fairly deep and well-separated
      directory structure with semantic meaning.
      
      What I mean by that is that it's often interesting to see exactly which
      sub-directories are impacted by a patch, and to what degree - even if you
      don't perhaps care so much about the individual files themselves.
      
      What makes the concept more interesting is that the "impact" is often
      hierarchical: in the kernel, for example, something could either have a
      very localized impact to "fs/ext3/" and then it's interesting to see that
      such a patch changes mostly that subdirectory, but you could have another
      patch that changes some generic VFS-layer issue which affects _many_
      subdirectories that are all under "fs/", but none - or perhaps just a
      couple of them - of the individual filesystems are interesting in
      themselves.
      
      So what commonly happens is that you may have big changes in a specific
      sub-subdirectory, but still also significant separate changes to the
      subdirectory leading up to that - maybe you have significant VFS-level
      changes, but *also* changes under that VFS layer in the NFS-specific
      directories, for example. In that case, you do want the low-level parts
      that are significant to show up, but then the insignificant ones should
      show up as under the more generic top-level directory.
      
      This patch shows all of that with "--dirstat". The output can be either
      something simple like
      
              commit 81772fe...
              Author: Thomas Gleixner <tglx@linutronix.de>
              Date:   Sun Feb 10 23:57:36 2008 +0100
      
                  x86: remove over noisy debug printk
      
                  pageattr-test.c contains a noisy debug printk that people reported.
                  The condition under which it prints (randomly tapping into a mem_map[]
                  hole and not being able to c_p_a() there) is valid behavior and not
                  interesting to report.
      
                  Remove it.
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      
               100.0% arch/x86/mm/
      
      or something much more complex like
      
              commit e231c2e...
              Author: David Howells <dhowells@redhat.com>
              Date:   Thu Feb 7 00:15:26 2008 -0800
      
                  Convert ERR_PTR(PTR_ERR(p)) instances to ERR_CAST(p)
      
      	  20.5% crypto/
      	   7.6% fs/afs/
      	   7.6% fs/fuse/
      	   7.6% fs/gfs2/
      	   5.1% fs/jffs2/
      	   5.1% fs/nfs/
      	   5.1% fs/nfsd/
      	   7.6% fs/reiserfs/
      	  15.3% fs/
      	   7.6% net/rxrpc/
      	  10.2% security/keys/
      
      where that latter example is an example of significant work in some
      individual fs/*/ subdirectories (like the patches to reiserfs accounting
      for 7.6% of the whole), but then discounting those individual filesystems,
      there's also 15.3% other "random" things that weren't worth reporting on
      their oen left over under fs/ in general (either in that directory itself,
      or in subdirectories of fs/ that didn't have enough changes to be reported
      individually).
      
      I'd like to stress that the "15.3% fs/" mentioned above is the stuff that
      is under fs/ but that was _not_ significant enough to report on its own.
      So the above does _not_ mean that 15.3% of the work was under fs/ per se,
      because that 15.3% does *not* include the already-reported 7.6% of afs,
      7.6% of fuse etc.
      
      If you want to enable "cumulative" directory statistics, you can use the
      "--cumulative" flag, which adds up percentages recursively even when
      they have been already reported for a sub-directory.  That cumulative
      output is disabled if *all* of the changes in one subdirectory come from
      a deeper subdirectory, to avoid repeating subdirectories all the way to
      the root.
      
      For an example of the cumulative reporting, the above commit becomes
      
      	commit e231c2e...
      	Author: David Howells <dhowells@redhat.com>
      	Date:   Thu Feb 7 00:15:26 2008 -0800
      
      	    Convert ERR_PTR(PTR_ERR(p)) instances to ERR_CAST(p)
      
      	  20.5% crypto/
      	   7.6% fs/afs/
      	   7.6% fs/fuse/
      	   7.6% fs/gfs2/
      	   5.1% fs/jffs2/
      	   5.1% fs/nfs/
      	   5.1% fs/nfsd/
      	   7.6% fs/reiserfs/
      	  61.5% fs/
      	   7.6% net/rxrpc/
      	  10.2% security/keys/
      
      in which the commit percentages now obviously add up to much more than
      100%: now the changes that were already reported for the sub-directories
      under fs/ are then cumulatively included in the whole percentage of fs/
      (ie now shows 61.5% as opposed to the 15.3% without the cumulative
      reporting).
      
      The default reporting limit has been arbitrarily set at 3%, which seems
      to be a pretty good cut-off, but you can specify the cut-off manually by
      giving it as an option parameter (eg "--dirstat=5" makes the cut-off be
      at 5% instead)
      
      NOTE! The percentages are purely about the total lines added and removed,
      not anything smarter (or dumber) than that. Also note that you should not
      generally expect things to add up to 100%: not only does it round down, we
      don't report leftover scraps (they add up to the top-level change count,
      but we don't even bother reporting that, it only reports subdirectories).
      
      Quite frankly, as a top-level manager this is really convenient for me,
      but it's going to be very boring for git itself since there are few
      subdirectories. Also, don't expect things to make tons of sense if you
      combine this with "-M" and there are cross-directory renames etc.
      
      But even for git itself, you can get some fun statistics. Try out
      
              git log --dirstat
      
      and see the occasional mentions of things like Documentation/, git-gui/,
      gitweb/ and gitk-git/. Or try out something like
      
              git diff --dirstat v1.5.0..v1.5.4
      
      which does kind of git an overview that shows *something*. But in general,
      the output is more exciting for big projects with deeper structure, and
      doing a
      
              git diff --dirstat v2.6.24..v2.6.25-rc1
      
      on the kernel is what I actually wrote this for!
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7df7c019
  25. 05 1月, 2008 1 次提交
    • 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
  26. 20 12月, 2007 1 次提交
  27. 14 12月, 2007 2 次提交
    • 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
  28. 12 11月, 2007 1 次提交
  29. 10 11月, 2007 2 次提交
    • J
      git-add: make the entry stat-clean after re-adding the same contents · fb63d7f8
      Junio C Hamano 提交于
      Earlier in commit 0781b8a9
      (add_file_to_index: skip rehashing if the cached stat already
      matches), add_file_to_index() were taught not to re-add the path
      if it already matches the index.
      
      The change meant well, but was not executed quite right.  It
      used ie_modified() to see if the file on the work tree is really
      different from the index, and skipped adding the contents if the
      function says "not modified".
      
      This was wrong.  There are three possible comparison results
      between the index and the file in the work tree:
      
       - with lstat(2) we _know_ they are different.  E.g. if the
         length or the owner in the cached stat information is
         different from the length we just obtained from lstat(2), we
         can tell the file is modified without looking at the actual
         contents.
      
       - with lstat(2) we _know_ they are the same.  The same length,
         the same owner, the same everything (but this has a twist, as
         described below).
      
       - we cannot tell from lstat(2) information alone and need to go
         to the filesystem to actually compare.
      
      The last case arises from what we call 'racy git' situation,
      that can be caused with this sequence:
      
          $ echo hello >file
          $ git add file
          $ echo aeiou >file ;# the same length
      
      If the second "echo" is done within the same filesystem
      timestamp granularity as the first "echo", then the timestamp
      recorded by "git add" and the timestamp we get from lstat(2)
      will be the same, and we can mistakenly say the file is not
      modified.  The path is called 'racily clean'.  We need to
      reliably detect racily clean paths are in fact modified.
      
      To solve this problem, when we write out the index, we mark the
      index entry that has the same timestamp as the index file itself
      (that is the time from the point of view of the filesystem) to
      tell any later code that does the lstat(2) comparison not to
      trust the cached stat info, and ie_modified() then actually goes
      to the filesystem to compare the contents for such a path.
      
      That's all good, but it should not be used for this "git add"
      optimization, as the goal of "git add" is to actually update the
      path in the index and make it stat-clean.  With the false
      optimization, we did _not_ cause any data loss (after all, what
      we failed to do was only to update the cached stat information),
      but it made the following sequence leave the file stat dirty:
      
          $ echo hello >file
          $ git add file
          $ echo hello >file ;# the same contents
          $ git add file
      
      The solution is not to use ie_modified() which goes to the
      filesystem to see if it is really clean, but instead use
      ie_match_stat() with "assume racily clean paths are dirty"
      option, to force re-adding of such a path.
      
      There was another problem with "git add -u".  The codepath
      shares the same issue when adding the paths that are found to be
      modified, but in addition, it asked "git diff-files" machinery
      run_diff_files() function (which is "git diff-files") to list
      the paths that are modified.  But "git diff-files" machinery
      uses the same ie_modified() call so that it does not report
      racily clean _and_ actually clean paths as modified, which is
      not what we want.
      
      The patch allows the callers of run_diff_files() to pass the
      same "assume racily clean paths are dirty" option, and makes
      "git-add -u" codepath to use that option, to discover and re-add
      racily clean _and_ actually clean paths.
      
      We could further optimize on top of this patch to differentiate
      the case where the path really needs re-adding (i.e. the content
      of the racily clean entry was indeed different) and the case
      where only the cached stat information needs to be refreshed
      (i.e. the racily clean entry was actually clean), but I do not
      think it is worth it.
      
      This patch applies to maint and all the way up.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fb63d7f8
    • J
      ce_match_stat, run_diff_files: use symbolic constants for readability · 4bd5b7da
      Junio C Hamano 提交于
      ce_match_stat() can be told:
      
       (1) to ignore CE_VALID bit (used under "assume unchanged" mode)
           and perform the stat comparison anyway;
      
       (2) not to perform the contents comparison for racily clean
           entries and report mismatch of cached stat information;
      
      using its "option" parameter.  Give them symbolic constants.
      
      Similarly, run_diff_files() can be told not to report anything
      on removed paths.  Also give it a symbolic constant for that.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4bd5b7da
  30. 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
  31. 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
  32. 23 6月, 2007 1 次提交
    • L
      Finally implement "git log --follow" · 750f7b66
      Linus Torvalds 提交于
      Ok, I've really held off doing this too damn long, because I'm lazy, and I
      was always hoping that somebody else would do it.
      
      But no, people keep asking for it, but nobody actually did anything, so I
      decided I might as well bite the bullet, and instead of telling people
      they could add a "--follow" flag to "git log" to do what they want to do,
      I decided that it looks like I just have to do it for them..
      
      The code wasn't actually that complicated, in that the diffstat for this
      patch literally says "70 insertions(+), 1 deletions(-)", but I will have
      to admit that in order to get to this fairly simple patch, you did have to
      know and understand the internal git diff generation machinery pretty
      well, and had to really be able to follow how commit generation interacts
      with generating patches and generating the log.
      
      So I suspect that while I was right that it wasn't that hard, I might have
      been expecting too much of random people - this patch does seem to be
      firmly in the core "Linus or Junio" territory.
      
      To make a long story short: I'm sorry for it taking so long until I just
      did it.
      
      I'm not going to guarantee that this works for everybody, but you really
      can just look at the patch, and after the appropriate appreciative noises
      ("Ooh, aah") over how clever I am, you can then just notice that the code
      itself isn't really that complicated.
      
      All the real new code is in the new "try_to_follow_renames()" function. It
      really isn't rocket science: we notice that the pathname we were looking
      at went away, so we start a full tree diff and try to see if we can
      instead make that pathname be a rename or a copy from some other previous
      pathname. And if we can, we just continue, except we show *that*
      particular diff, and ever after we use the _previous_ pathname.
      
      One thing to look out for: the "rename detection" is considered to be a
      singular event in the _linear_ "git log" output! That's what people want
      to do, but I just wanted to point out that this patch is *not* carrying
      around a "commit,pathname" kind of pair and it's *not* going to be able to
      notice the file coming from multiple *different* files in earlier history.
      
      IOW, if you use "git log --follow", then you get the stupid CVS/SVN kind
      of "files have single identities" kind of semantics, and git log will just
      pick the identity based on the normal move/copy heuristics _as_if_ the
      history could be linearized.
      
      Put another way: I think the model is broken, but given the broken model,
      I think this patch does just about as well as you can do. If you have
      merges with the same "file" having different filenames over the two
      branches, git will just end up picking _one_ of the pathnames at the point
      where the newer one goes away. It never looks at multiple pathnames in
      parallel.
      
      And if you understood all that, you probably didn't need it explained, and
      if you didn't understand the above blathering, it doesn't really mtter to
      you. What matters to you is that you can now do
      
      	git log -p --follow builtin-rev-list.c
      
      and it will find the point where the old "rev-list.c" got renamed to
      "builtin-rev-list.c" and show it as such.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      750f7b66
  33. 08 6月, 2007 1 次提交
  34. 23 4月, 2007 1 次提交
    • J
      Support 'diff=pgm' attribute · f1af60bd
      Junio C Hamano 提交于
      This enhances the attributes mechanism so that external programs
      meant for existing GIT_EXTERNAL_DIFF interface can be specifed
      per path.
      
      To configure such a custom diff driver, first define a custom
      diff driver in the configuration:
      
      	[diff "my-c-diff"]
      		command = <<your command string comes here>>
      
      Then mark the paths that you want to use this custom driver
      using the attribute mechanism.
      
      	*.c	diff=my-c-diff
      
      The intent of this separation is that the attribute mechanism is
      used for specifying the type of the contents, while the
      configuration mechanism is used to define what needs to be done
      to that type of the contents, which would be specific to both
      platform and personal taste.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      f1af60bd
  35. 15 3月, 2007 2 次提交
    • J
      diff --quiet · 68aacb2f
      Junio C Hamano 提交于
      This adds the command line option 'quiet' to tell 'git diff-*'
      that we are not interested in the actual diff contents but only
      want to know if there is any change.  This option automatically
      turns --exit-code on, and turns off output formatting, as it
      does not make much sense to show the first hit we happened to
      have found.
      
      The --quiet option is silently turned off (but --exit-code is
      still in effect, so is silent output) if postprocessing filters
      such as pickaxe and diff-filter are used.  For all practical
      purposes I do not think of a reason to want to use these filters
      and not viewing the diff output.
      
      The backends have not been taught about the option with this patch.
      That is a topic for later rounds.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      68aacb2f
    • J
      Remove unused diffcore_std_no_resolve · 3161b4b5
      Junio C Hamano 提交于
      This was only used by diff-tree-helper program, whose purpose
      was to translate a raw diff to a patch.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      3161b4b5