1. 03 8月, 2011 1 次提交
    • C
      commit: allow partial commits with relative paths · 8894d535
      Clemens Buchacher 提交于
      In order to do partial commits, git-commit overlays a tree on the
      cache and checks pathspecs against the result. Currently, the
      overlaying is done using "prefix" which prevents relative pathspecs
      with ".." and absolute pathspec from matching when they refer to
      files not under "prefix" and absent from the index, but still in
      the tree (i.e.  files staged for removal).
      
      The point of providing a prefix at all is performance optimization.
      If we say there is no common prefix for the files of interest, then
      we have to read the entire tree into the index.
      
      But even if we cannot use the working directory as a prefix, we can
      still figure out if there is a common prefix for all given paths,
      and use that instead. The pathspec_prefix() routine from ls-files.c
      does exactly that.
      
      Any use of global variables is removed from pathspec_prefix() so
      that it can be called from commit.c.
      Reported-by: NReuben Thomas <rrt@sc3d.org>
      Analyzed-by: NMichael J Gruber <git@drmicha.warpmail.net>
      Signed-off-by: NClemens Buchacher <drizzd@aon.at>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8894d535
  2. 27 5月, 2011 1 次提交
  3. 18 5月, 2011 1 次提交
  4. 11 5月, 2011 4 次提交
    • J
      rev/path disambiguation: further restrict "misspelled index entry" diag · 0e539dca
      Junio C Hamano 提交于
      A colon followed by anything !isalnum() (e.g. ":/heh") at this point is
      known not to be an existing rev.  Just give a generic "neither a rev nor
      a path" error message.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0e539dca
    • J
      fix overslow :/no-such-string-ever-existed diagnostics · 2e83b66c
      Junio C Hamano 提交于
      "git cmd :/no-such-string-ever-existed" runs an extra round of get_sha1()
      since 009fee47 (Detailed diagnosis when parsing an object name fails.,
      2009-12-07).  Once without error diagnosis to see there is no commit with
      such a string in the log message (hence "it cannot be a ref"), and after
      seeing that :/no-such-string-ever-existed is not a filename (hence "it
      cannot be a path, either"), another time to give "better diagnosis".
      
      The thing is, the second time it runs, we already know that traversing the
      history all the way down to the root will _not_ find any matching commit.
      
      Rename misguided "gently" parameter, which is turned off _only_ when the
      "detailed diagnosis" codepath knows that it cannot be a ref and making the
      call only for the caller to die with a message.  Flip its meaning (and
      adjust the callers) and call it "only_to_die", which is not a great name,
      but it describes far more clearly what the codepaths that switches their
      behaviour based on this variable do.
      
      On my box, the command spends ~1.8 seconds without the patch to make the
      report; with the patch it spends ~1.12 seconds.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      2e83b66c
    • J
      pathspec: drop "lone : means no pathspec" from get_pathspec() · b060ce7d
      Junio C Hamano 提交于
      We may want to give the pathspec subsystem such a feature, but not while
      we are still using get_pathspec() that returns a stupid "char **" that
      loses subtle nuances that existed in the input string.
      
      In the meantime, the callers of get_pathspec() that want to support it
      could do an equivalent before feeding their argv[] to the function
      themselves quite easily.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b060ce7d
    • J
      Revert "magic pathspec: add ":(icase)path" to match case insensitively" · 6d942927
      Junio C Hamano 提交于
      This reverts commit d0546e2d, which
      was only meant to be a Proof-of-concept used during the discussion.
      
      The real implementation of the feature needs to wait until we migrate
      all the code to use "struct pathspec", not "char **", to represent
      richer semantics given to pathspec.
      6d942927
  5. 09 4月, 2011 2 次提交
    • J
    • J
      magic pathspec: futureproof shorthand form · 2f6c9760
      Junio C Hamano 提交于
      The earlier design was to take whatever non-alnum that the short format
      parser happens to support, leaving the rest as part of the pattern, so a
      version of git that knows '*' magic and a version that does not would have
      behaved differently when given ":*Makefile".  The former would have
      applied the '*' magic to the pattern "Makefile", while the latter would
      used no magic to the pattern "*Makefile".
      
      Instead, just reserve all non-alnum ASCII letters that are neither glob
      nor regexp special as potential magic signature, and when we see a magic
      that is not supported, die with an error message, just like the longhand
      codepath does.
      
      With this, ":%#!*Makefile" will always mean "%#!" magic applied to the
      pattern "*Makefile", no matter what version of git is used (it is a
      different matter if the version of git supports all of these three magic
      matching rules).
      
      Also make ':' without anything else to mean "there is no pathspec".  This
      would allow differences between "git log" and "git log ." run from the top
      level of the working tree (the latter simplifies no-op commits away from
      the history) to be expressed from a subdirectory by saying "git log :".
      Helped-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      2f6c9760
  6. 07 4月, 2011 1 次提交
    • J
      magic pathspec: add tentative ":/path/from/top/level" pathspec support · 8a42c985
      Junio C Hamano 提交于
      Support ":/" magic string that can be prefixed to a pathspec element to
      say "this names the path from the top-level of the working tree", when
      you are in the subdirectory.
      
      For example, you should be able to say:
      
          $ edit Makefile ;# top-level
          $ cd Documentation
          $ edit git.txt ;# in the subdirectory
      
      and then do one of three things, still inside the subdirectory:
      
          $ git add -u .  ;# add only Documentation/git.txt
          $ git add -u :/ ;# add everything, including paths outside Documentation
          $ git add -u    ;# whatever the default setting is.
      
      To truly support magic pathspec, the API needs to be restructured so that
      get_pathspec() and init_pathspec() are unified into one call.  Currently,
      the former just prefixes the user supplied pathspec with the current
      subdirectory path, and the latter takes the output from the former and
      pre-parses them into a bit richer structure for easier handling.  They
      should become a single API function that takes the current subdirectory
      path and the remainder of argv[] (after parsing --options and revision
      arguments from the command line) and returns an array of parsed pathspec
      elements, and "magic" should become attributes of struct pathspec_item.
      
      This patch implements only "top" magic because it can be hacked into the
      system without such a refactoring.
      
      The syntax for magic pathspec prefix is designed to be extensible yet
      simple to type to invoke a simple magic like "from the top".  The parser
      for the magic prefix is hooked into get_pathspec() function in this patch,
      and it needs to be moved when we refactor the API.
      
      But we have to start from somewhere.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8a42c985
  7. 29 3月, 2011 1 次提交
  8. 18 3月, 2011 1 次提交
  9. 22 1月, 2011 1 次提交
    • J
      Subject: setup: officially support --work-tree without --git-dir · 4868b2ea
      Jonathan Nieder 提交于
      The original intention of --work-tree was to allow people to work in a
      subdirectory of their working tree that does not have an embedded .git
      directory.  Because their working tree, which their $cwd was in, did not
      have an embedded .git, they needed to use $GIT_DIR to specify where it is,
      and because this meant there was no way to discover where the root level
      of the working tree was, so we needed to add $GIT_WORK_TREE to tell git
      where it was.
      
      However, this facility has long been (mis)used by people's scripts to
      start git from a working tree _with_ an embedded .git directory, let git
      find .git directory, and then pretend as if an unrelated directory were
      the associated working tree of the .git directory found by the discovery
      process.  It happens to work in simple cases, and is not worth causing
      "regression" to these scripts.
      Signed-off-by: NJonathan Nieder <jrnieder@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4868b2ea
  10. 05 1月, 2011 1 次提交
  11. 28 12月, 2010 1 次提交
  12. 23 12月, 2010 5 次提交
  13. 08 12月, 2010 2 次提交
  14. 19 10月, 2010 1 次提交
  15. 12 8月, 2010 1 次提交
    • N
      setup: remember whether repository was found · a60645f9
      Nguyễn Thái Ngọc Duy 提交于
      As v1.7.2~16^2 (git --paginate: paginate external commands
      again, 2010-07-14) explains, builtins (like git config) that
      do not use RUN_SETUP are not finding GIT_DIR set correctly when
      it is time to launch the pager from run_builtin().  If they
      were to search for a repository sooner, then the outcome of such
      early repository accesses would be more predictable and reliable.
      
      The cmd_*() functions learn whether a repository was found through the
      *nongit_ok return value from setup_git_directory_gently().  If
      run_builtin() is to take care of the repository search itself, that
      datum needs to be retrievable from somewhere else.  Use the
      startup_info struct for this.
      
      As a bonus, this information becomes available to functions such as
      git_config() which might want to avoid trying to access a repository
      when none is present.
      Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      Signed-off-by: NJonathan Nieder <jrnieder@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a60645f9
  16. 05 8月, 2010 2 次提交
  17. 26 7月, 2010 6 次提交
  18. 21 7月, 2010 1 次提交
  19. 14 7月, 2010 1 次提交
    • R
      Use dev_t for device id (st_dev) from stat in setup_git_directory_gently() · c7d1d1b1
      Raja R Harinath 提交于
      The original declaration was int, which seems to cause trouble on my
      machine.  It causes spurious "filesystem boundary" errors when running
      the testsuite.  The cause seems to be
      
        $ stat -c%d .
        2147549952
      
      which is too large for a 32-bit int type.
      
      Using the correct type, dev_t, solves the issue.  (Because I'm
      paranoid and forgetful, I checked -- yes, Unix v7 had dev_t.)
      
      Other uses of st_dev seem to be reasonably safe.   fill_stat_cache_info
      truncates it to an 'unsigned int', but that value seems to be used only
      to validate the cache, and only if USE_STDEV is defined.
      Signed-off-by: NRaja R Harinath <harinath@hurrynot.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c7d1d1b1
  20. 05 6月, 2010 1 次提交
  21. 05 4月, 2010 2 次提交
    • J
      Rename ONE_FILESYSTEM to DISCOVERY_ACROSS_FILESYSTEM · cf87463e
      Junio C Hamano 提交于
      If a missing ONE_FILESYSTEM defaults to true, the only users who set this
      variable set it to false to tell git not to limit the discovery to one
      filesystem; there are too many negations in one sentence to make a simple
      panda brain dizzy.
      
      Use the variable GIT_DISCOVERY_ACROSS_FILESYSTEM that changes the
      behaviour from the default "limit to one filesystem" to "cross the
      boundary as I ask you to"; makes the semantics much more straight
      forward.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cf87463e
    • J
      GIT_ONE_FILESYSTEM: flip the default to stop at filesystem boundaries · e6405517
      Junio C Hamano 提交于
      Regarding the new environment variable, Linus Torvalds
      <torvalds@linux-foundation.org> writes on Tue, 30 Mar 2010 in
      <alpine.LFD.2.00.1003301537150.3707@i5.linux-foundation.org>:
      
          I suspect that it is _very_ unusual to have a source repo that crosses
          multiple filesystems, and the original reason for this patch-series
          seems to me to be likely to be more common than that multi-fs case. So
          having the logic go the other way would seem to match the common case,
          no?
      
      The "crossing filesystem boundary" condition is checked by comparing
      st_dev field in the result from stat(2).  This is slightly worrysome if
      non-POSIX ports return different values in the field even for directories
      in the same work tree extracted to the same "filesystem".  Erik Faye-Lund
      confirms that in the msysgit port st_dev is 0, so this should be safe, as
      "even Windows is safe" ;-)
      
      This will affect those who use /.git to cram /etc and /home/me in the same
      repostiory, /home is mounted from non-root filesystem, and a git operation
      is done from inside /home/me/src.  But that is such a corner case we don't
      want to give preference over helping people who will benefit from having
      this default so that they do not have to suffer from slow automounters.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e6405517
  22. 29 3月, 2010 2 次提交
  23. 17 2月, 2010 1 次提交
    • N
      Support working directory located at root · 72ec8ba6
      Nguyễn Thái Ngọc Duy 提交于
      Git should work regardless where the working directory is located,
      even at root. This patch fixes two places where it assumes working
      directory always have parent directory.
      
      In setup_git_directory_gently(), when Git goes up to root and finds
      .git there, it happily sets worktree to "" instead of "/".
      
      In prefix_path(), loosen the outside repo check a little bit. Usually
      when a path XXX is inside worktree /foo, it must be either "/foo", or
      "/foo/...". When worktree is simply "/", we can safely ignore the
      check: we have a slash at the beginning already.
      
      Not related to worktree, but also set gitdir correctly if a bare repo
      is placed (insanely?) at root.
      
      Thanks João Carlos Mendes Luís for pointing out this problem.
      Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      72ec8ba6