1. 17 1月, 2013 1 次提交
  2. 16 1月, 2013 1 次提交
    • N
      attr: fix off-by-one directory component length calculation · 711536bd
      Nguyễn Thái Ngọc Duy 提交于
      94bc671a (Add directory pattern matching to attributes - 2012-12-08)
      uses find_basename() to calculate the length of directory part in
      prepare_attr_stack. This function expects the directory without the
      trailing slash (as "origin" field in match_attr struct is without the
      trailing slash). find_basename() includes the trailing slash and
      confuses push/pop algorithm.
      
      Consider path = "abc/def" and the push down code:
      
      	while (1) {
      		len = strlen(attr_stack->origin);
      		if (dirlen <= len)
      			break;
      		cp = memchr(path + len + 1, '/', dirlen - len - 1);
      		if (!cp)
      			cp = path + dirlen;
      
      dirlen is 4, not 3, without this patch. So when attr_stack->origin is
      "abc", it'll miss the exit condition because 4 <= 3 is wrong. It'll
      then try to push "abc/" down the attr stack (because "cp" would be
      NULL). So we have both "abc" and "abc/" in the stack.
      
      Next time when "abc/ghi" is checked, "abc/" is popped out because of
      the off-by-one dirlen, only to be pushed back in again by the above
      code. This repeats for all files in the same directory. Which means
      at least one failed open syscall per file, or more if .gitattributes
      exists.
      
      This is the perf result with 10 runs on git.git:
      
      Test                                     94bc671a^          94bc671a                   HEAD
      ----------------------------------------------------------------------------------------------------------
      7810.1: grep worktree, cheap regex       0.02(0.01+0.04)   0.05(0.03+0.05) +150.0%   0.02(0.01+0.04) +0.0%
      7810.2: grep worktree, expensive regex   0.25(0.94+0.01)   0.26(0.94+0.02) +4.0%     0.25(0.93+0.02) +0.0%
      7810.3: grep --cached, cheap regex       0.11(0.10+0.00)   0.12(0.10+0.02) +9.1%     0.10(0.10+0.00) -9.1%
      7810.4: grep --cached, expensive regex   0.61(0.60+0.01)   0.62(0.61+0.01) +1.6%     0.61(0.60+0.00) +0.0%
      Reported-by: NRoss Lagerwall <rosslagerwall@gmail.com>
      Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      711536bd
  3. 18 12月, 2012 1 次提交
  4. 16 10月, 2012 1 次提交
    • N
      attr: more matching optimizations from .gitignore · 82dce998
      Nguyễn Thái Ngọc Duy 提交于
      .gitattributes and .gitignore share the same pattern syntax but has
      separate matching implementation. Over the years, ignore's
      implementation accumulates more optimizations while attr's stays the
      same.
      
      This patch reuses the core matching functions that are also used by
      excluded_from_list. excluded_from_list and path_matches can't be
      merged due to differences in exclude and attr, for example:
      
      * "!pattern" syntax is forbidden in .gitattributes.  As an attribute
        can be unset (i.e. set to a special value "false") or made back to
        unspecified (i.e. not even set to "false"), "!pattern attr" is unclear
        which one it means.
      
      * we support attaching attributes to directories, but git-core
        internally does not currently make use of attributes on
        directories.
      Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      82dce998
  5. 06 10月, 2012 2 次提交
  6. 14 9月, 2012 1 次提交
    • J
      attr: failure to open a .gitattributes file is OK with ENOTDIR · 8e950dab
      Junio C Hamano 提交于
      Often we consult an in-tree .gitattributes file that exists per
      directory.  Majority of directories do not usually have such a file,
      and it is perfectly fine if we cannot open it because there is no
      such file, but we do want to know when there is an I/O or permission
      error.  Earlier, we made the codepath warn when we fail to open it
      for reasons other than ENOENT for that reason.
      
      We however sometimes have to attempt to open the .gitattributes file
      from a directory that does not exist in the commit that is currently
      checked out.  "git pack-objects" wants to know if a path is marked
      with "-delta" attributes, and "git archive" wants to know about
      export-ignore and export-subst attributes.  Both commands may and do
      need to ask the attributes system about paths in an arbitrary
      commit.  "git diff", after removing an entire directory, may want to
      know textconv on paths that used to be in that directory.
      
      Make sure we also ignore a failure to open per-directory attributes
      file due to ENOTDIR.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8e950dab
  7. 09 9月, 2012 1 次提交
  8. 22 8月, 2012 2 次提交
    • J
      warn_on_inaccessible(): a helper to warn on inaccessible paths · 55b38a48
      Junio C Hamano 提交于
      The previous series introduced warnings to multiple places, but it
      could become tiring to see the warning on the same path over and
      over again during a single run of Git.  Making just one function
      responsible for issuing this warning, we could later choose to keep
      track of which paths we issued a warning (it would involve a hash
      table of paths after running them through real_path() or something)
      in order to reduce noise.
      
      Right now we do not know if the noise reduction is necessary, but it
      still would be a good code reduction/sharing anyway.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      55b38a48
    • J
      attr: warn on inaccessible attribute files · 11e50b27
      Jeff King 提交于
      Just like config and gitignore files, we silently ignore
      missing or inaccessible attribute files. An existent but
      inaccessible file is probably a configuration error, so
      let's warn the user.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      11e50b27
  9. 24 7月, 2012 1 次提交
    • J
      attr: make sure we have an xdg path before using it · f0c1c15c
      Jeff King 提交于
      If we don't have a core.attributesfile configured, we fall
      back to checking XDG config, which is usually
      $HOME/.config/git/attributes.
      
      However, if $HOME is unset, then home_config_paths will return
      NULL, and we end up calling fopen(NULL).
      
      Depending on your system, this may or may not cause the
      accompanying test to fail (e.g., on Linux and glibc, the
      address will go straight to open, which will return EFAULT).
      However, valgrind will reliably notice the error.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f0c1c15c
  10. 26 6月, 2012 1 次提交
  11. 12 1月, 2012 1 次提交
  12. 11 1月, 2012 4 次提交
    • J
      attr.c: clarify the logic to pop attr_stack · c432ef99
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c432ef99
    • J
      attr.c: make bootstrap_attr_stack() leave early · 909ca7b9
      Junio C Hamano 提交于
      Thas would de-dent the body of a function that has grown rather large over
      time, making it a bit easier to read.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      909ca7b9
    • J
      attr: drop misguided defensive coding · 77f7f822
      Jeff King 提交于
      In prepare_attr_stack, we pop the old elements of the stack
      (which were left from a previous lookup and may or may not
      be useful to us). Our loop to do so checks that we never
      reach the top of the stack. However, the code immediately
      afterwards will segfault if we did actually reach the top of
      the stack.
      
      Fortunately, this is not an actual bug, since we will never
      pop all of the stack elements (we will always keep the root
      gitattributes, as well as the builtin ones). So the extra
      check in the loop condition simply clutters the code and
      makes the intent less clear. Let's get rid of it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      77f7f822
    • J
      attr: don't confuse prefixes with leading directories · 1afca444
      Jeff King 提交于
      When we prepare the attribute stack for a lookup on a path,
      we start with the cached stack from the previous lookup
      (because it is common to do several lookups in the same
      directory hierarchy). So the first thing we must do in
      preparing the stack is to pop any entries that point to
      directories we are no longer interested in.
      
      For example, if our stack contains gitattributes for:
      
        foo/bar/baz
        foo/bar
        foo
      
      but we want to do a lookup in "foo/bar/bleep", then we want
      to pop the top element, but retain the others.
      
      To do this we walk down the stack from the top, popping
      elements that do not match our lookup directory. However,
      the test do this simply checked strncmp, meaning we would
      mistake "foo/bar/baz" as a leading directory of
      "foo/bar/baz_plus". We must also check that the character
      after our match is '/', meaning we matched the whole path
      component.
      
      There are two special cases to consider:
      
        1. The top of our attr stack has the empty path. So we
           must not check for '/', but rather special-case the
           empty path, which always matches.
      
        2. Typically when matching paths in this way, you would
           also need to check for a full string match (i.e., the
           character after is '\0'). We don't need to do so in
           this case, though, because our path string is actually
           just the directory component of the path to a file
           (i.e., we know that it terminates with "/", because the
           filename comes after that).
      Helped-by: NMichael Haggerty <mhagger@alum.mit.edu>
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1afca444
  13. 12 10月, 2011 1 次提交
    • B
      attr.c: respect core.ignorecase when matching attribute patterns · 6eba6210
      Brandon Casey 提交于
      When core.ignorecase is true, the file globs configured in the
      .gitattributes file should be matched case-insensitively against the paths
      in the working directory.  Let's do so.
      
      Plus, add some tests.
      
      The last set of tests is performed only on a case-insensitive filesystem.
      Those tests make sure that git handles the case where the .gitignore file
      resides in a subdirectory and the user supplies a path that does not match
      the case in the filesystem.  In that case^H^H^H^Hsituation, part of the
      path supplied by the user is effectively interpreted case-insensitively,
      and part of it is dependent on the setting of core.ignorecase.  git will
      currently only match the portion of the path below the directory holding
      the .gitignore file according to the setting of core.ignorecase.
      
      This is also partly future-proofing.  Currently, git builds the attr stack
      based on the path supplied by the user, so we don't have to do anything
      special (like use strcmp_icase) to handle the parts of that path that don't
      match the filesystem with respect to case.  If git instead built the attr
      stack by scanning the repository, then the paths in the origin field would
      not necessarily match the paths supplied by the user.  If someone makes a
      change like that in the future, these tests will notice.
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6eba6210
  14. 07 10月, 2011 3 次提交
    • J
      attr: read core.attributesfile from git_default_core_config · 64589a03
      Junio C Hamano 提交于
      This code calls git_config from a helper function to parse the config entry
      it is interested in.  Calling git_config in this way may cause a problem if
      the helper function can be called after a previous call to git_config by
      another function since the second call to git_config may reset some
      variable to the value in the config file which was previously overridden.
      
      The above is not a problem in this case since the function passed to
      git_config only parses one config entry and the variable it sets is not
      assigned outside of the parsing function.  But a programmer who desires
      all of the standard config options to be parsed may be tempted to modify
      git_attr_config() so that it falls back to git_default_config() and then it
      _would_ be vulnerable to the above described behavior.
      
      So, move the call to git_config up into the top-level cmd_* function and
      move the responsibility for parsing core.attributesfile into the main
      config file parser.
      
      Which is only the logical thing to do ;-)
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      64589a03
    • B
      cleanup: use internal memory allocation wrapper functions everywhere · 040a6551
      Brandon Casey 提交于
      The "x"-prefixed versions of strdup, malloc, etc. will check whether the
      allocation was successful and terminate the process otherwise.
      
      A few uses of malloc were left alone since they already implemented a
      graceful path of failure or were in a quasi external library like xdiff.
      
      Additionally, the call to malloc in compat/win32/syslog.c was not modified
      since the syslog() implemented there is a die handler and a call to the
      x-wrappers within a die handler could result in recursion should memory
      allocation fail.  This will have to be addressed separately.
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      040a6551
    • B
      attr.c: avoid inappropriate access to strbuf "buf" member · 97410b27
      Brandon Casey 提交于
      This code sequence performs a strcpy into the buf member of a strbuf
      struct.  The strcpy may move the position of the terminating nul of the
      string and effectively change the length of string so that it does not
      match the len member of the strbuf struct.
      
      Currently, this sequence works since the strbuf was given a hint when it
      was initialized to allocate enough space to accomodate the string that will
      be strcpy'ed, but this is an implementation detail of strbufs, not a
      guarantee.
      
      So, lets rework this sequence so that the strbuf is only manipulated by
      strbuf functions, and direct modification of its "buf" member is not
      necessary.
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      97410b27
  15. 15 8月, 2011 7 次提交
  16. 05 8月, 2011 9 次提交
  17. 23 4月, 2011 1 次提交
    • R
      sparse: Fix some "symbol not declared" warnings · c5147722
      Ramsay Jones 提交于
      In particular, sparse issues the "symbol 'a_symbol' was not declared.
      Should it be static?" warnings for the following symbols:
      
          attr.c:468:12: 'git_etc_gitattributes'
          attr.c:476:5:  'git_attr_system'
          vcs-svn/svndump.c:282:6: 'svndump_read'
          vcs-svn/svndump.c:417:5: 'svndump_init'
          vcs-svn/svndump.c:432:6: 'svndump_deinit'
          vcs-svn/svndump.c:445:6: 'svndump_reset'
      
      The symbols in attr.c only require file scope, so we add the static
      modifier to their declaration.
      
      The symbols in vcs-svn/svndump.c are external symbols, and they
      already have extern declarations in the "svndump.h" header file,
      so we simply include the header in svndump.c.
      Signed-off-by: NRamsay Jones <ramsay@ramsay1.demon.co.uk>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c5147722
  18. 16 3月, 2011 1 次提交
  19. 02 9月, 2010 1 次提交