1. 09 Oct, 2016 1 commit
  2. 07 Oct, 2016 1 commit
  3. 06 Oct, 2016 5 commits
  4. 05 Sep, 2016 1 commit
  5. 30 Aug, 2016 1 commit
  6. 29 Aug, 2016 1 commit
  7. 24 Aug, 2016 1 commit
  8. 12 Aug, 2016 1 commit
    • ignore: allow unignoring basenames in subdirectories · fcb2c1c8
      The .gitignore file allows for patterns which unignore previous
      ignore patterns. When unignoring a previous pattern, there are
      basically three cases how this is matched when no globbing is
      used:
      
      1. when a previous file has been ignored, it can be unignored by
         using its exact name, e.g.
      
         foo/bar
         !foo/bar
      
      2. when a file in a subdirectory has been ignored, it can be
         unignored by using its basename, e.g.
      
         foo/bar
         !bar
      
      3. when all files with a basename are ignored, a specific file
         can be unignored again by specifying its path in a
         subdirectory, e.g.
      
         bar
         !foo/bar
      
      The first problem in libgit2 is that we did not correctly treat
      the second case. While we verified that the negative pattern
      matches the tail of the positive one, we did not verify if it
      only matches the basename of the positive pattern. So e.g. we
      would have also negated a pattern like
      
          foo/fruz_bar
          !bar
      
      Furthermore, we did not check for the third case, where a
      basename is being unignored in a certain subdirectory again.
      
      Both issues are fixed with this commit.
      Patrick Steinhardt committed
  9. 10 Aug, 2016 2 commits
  10. 09 Aug, 2016 1 commit
  11. 06 Aug, 2016 1 commit
  12. 05 Aug, 2016 1 commit
    • odb: only provide the empty tree · becadafc
      Only provide the empty tree internally, which matches git's behavior.
      If we provide the empty blob then any users trying to write it with
      libgit2 would omit it from actually landing in the odb, which appear
      to git proper as a broken repository (missing that object).
      Edward Thomson committed
  13. 04 Aug, 2016 4 commits
    • odb: only freshen pack files every 2 seconds · 27051d4e
      Since writing multiple objects may all already exist in a single
      packfile, avoid freshening that packfile repeatedly in a tight loop.
      Instead, only freshen pack files every 2 seconds.
      Edward Thomson committed
    • odb: freshen existing objects when writing · 8f09a98e
      When writing an object, we calculate its OID and see if it exists in the
      object database.  If it does, we need to freshen the file that contains
      it.
      Edward Thomson committed
    • refspec: do not set empty rhs for fetch refspecs · 1eee631d
      According to git-fetch(1), "[t]he colon can be omitted when <dst>
      is empty." So according to git, the refspec "refs/heads/master"
      is the same as the refspec "refs/heads/master:" when fetching
      changes. When trying to fetch from a remote with a trailing
      colon with libgit2, though, the fetch actually fails while it
      works when the trailing colon is left out. So obviously, libgit2
      does _not_ treat these two refspec formats the same for fetches.
      
      The problem results from parsing refspecs, where the resulting
      refspec has its destination set to an empty string in the case of
      a trailing colon and to a `NULL` pointer in the case of no
      trailing colon. When passing this to our DWIM machinery, the
      empty string gets translated to "refs/heads/", which is simply
      wrong.
      
      Fix the problem by having the parsing machinery treat both cases
      the same for fetch refspecs.
      Patrick Steinhardt committed
    • clar: fix parsing of test suite prefixes · f2cab0a6
      When passing in a specific suite which should be executed by clar
      via `-stest::suite`, we try to parse this string and then include
      all tests contained in this suite. This also includes all tests
      in sub-suites, e.g. 'test::suite::foo'.
      
      In the case where multiple suites start with the same _string_,
      for example 'test::foo' and 'test::foobar', we fail to
      distinguish this correctly. When passing in `-stest::foobar`,
      we wrongly determine that 'test::foo' is a prefix and try to
      execute all of its matching functions. But as no function
      will now match 'test::foobar', we simply execute nothing.
      
      To fix this, we instead have to check if the prefix is an actual
      suite prefix as opposed to a simple string prefix. We do so by by
      inspecting if the first two characters trailing the prefix are
      our suite delimiters '::', and only consider the filter as
      matching in this case.
      Patrick Steinhardt committed
  14. 24 Jul, 2016 2 commits
  15. 06 Jul, 2016 1 commit
  16. 05 Jul, 2016 1 commit
  17. 29 Jun, 2016 2 commits
  18. 26 Jun, 2016 4 commits
  19. 24 Jun, 2016 3 commits
    • Add GIT_REPOSITORY_OPEN_FROM_ENV flag to respect $GIT_* environment vars · 0dd98b69
      git_repository_open_ext provides parameters for the start path, whether
      to search across filesystems, and what ceiling directories to stop at.
      git commands have standard environment variables and defaults for each
      of those, as well as various other parameters of the repository. To
      avoid duplicate environment variable handling in users of libgit2, add a
      GIT_REPOSITORY_OPEN_FROM_ENV flag, which makes git_repository_open_ext
      automatically handle the appropriate environment variables. Commands
      that intend to act just like those built into git itself can use this
      flag to get the expected default behavior.
      
      git_repository_open_ext with the GIT_REPOSITORY_OPEN_FROM_ENV flag
      respects $GIT_DIR, $GIT_DISCOVERY_ACROSS_FILESYSTEM,
      $GIT_CEILING_DIRECTORIES, $GIT_INDEX_FILE, $GIT_NAMESPACE,
      $GIT_OBJECT_DIRECTORY, and $GIT_ALTERNATE_OBJECT_DIRECTORIES.  In the
      future, when libgit2 gets worktree support, git_repository_open_env will
      also respect $GIT_WORK_TREE and $GIT_COMMON_DIR; until then,
      git_repository_open_ext with this flag will error out if either
      $GIT_WORK_TREE or $GIT_COMMON_DIR is set.
      Josh Triplett committed
    • Add GIT_REPOSITORY_OPEN_NO_DOTGIT flag to avoid appending /.git · 39c6fca3
      GIT_REPOSITORY_OPEN_NO_SEARCH does not search up through parent
      directories, but still tries the specified path both directly and with
      /.git appended.  GIT_REPOSITORY_OPEN_BARE avoids appending /.git, but
      opens the repository in bare mode even if it has a working directory.
      To support the semantics git uses when given $GIT_DIR in the
      environment, provide a new GIT_REPOSITORY_OPEN_NO_DOTGIT flag to not try
      appending /.git.
      Josh Triplett committed
    • Fix repository discovery with ceiling_dirs at current directory · ed577134
      git only checks ceiling directories when its search ascends to a parent
      directory.  A ceiling directory matching the starting directory will not
      prevent git from finding a repository in the starting directory or a
      parent directory.  libgit2 handled the former case correctly, but
      differed from git in the latter case: given a ceiling directory matching
      the starting directory, but no repository at the starting directory,
      libgit2 would stop the search at that point rather than finding a
      repository in a parent directory.
      
      Test case using git command-line tools:
      
      /tmp$ git init x
      Initialized empty Git repository in /tmp/x/.git/
      /tmp$ cd x/
      /tmp/x$ mkdir subdir
      /tmp/x$ cd subdir/
      /tmp/x/subdir$ GIT_CEILING_DIRECTORIES=/tmp/x git rev-parse --git-dir
      fatal: Not a git repository (or any of the parent directories): .git
      /tmp/x/subdir$ GIT_CEILING_DIRECTORIES=/tmp/x/subdir git rev-parse --git-dir
      /tmp/x/.git
      
      Fix the testsuite to test this case (in one case fixing a test that
      depended on the current behavior), and then fix find_repo to handle this
      case correctly.
      
      In the process, simplify and document the logic in find_repo():
      - Separate the concepts of "currently checking a .git directory" and
        "number of iterations left before going further counts as a search"
        into two separate variables, in_dot_git and min_iterations.
      - Move the logic to handle in_dot_git and append /.git to the top of the
        loop.
      - Only search ceiling_dirs and find ceiling_offset after running out of
        min_iterations; since ceiling_offset only tracks the longest matching
        ceiling directory, if ceiling_dirs contained both the current
        directory and a parent directory, this change makes find_repo stop the
        search at the parent directory.
      Josh Triplett committed
  20. 21 Jun, 2016 2 commits
  21. 20 Jun, 2016 1 commit
  22. 15 Jun, 2016 1 commit
  23. 07 Jun, 2016 1 commit
  24. 02 Jun, 2016 1 commit