KEMBAR78
Comparing 209f075593...5b15eb397d · git/git · GitHub
Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: git/git
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 209f075593
Choose a base ref
...
head repository: git/git
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 5b15eb397d
Choose a head ref
  • 18 commits
  • 10 files changed
  • 1 contributor

Commits on Jun 20, 2019

  1. commit-graph: document commit-graph chains

    Add a basic description of commit-graph chains. More details about the
    feature will be added as we add functionality. This introduction gives a
    high-level overview to the goals of the feature and the basic layout of
    commit-graph chains.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    890345a View commit details
    Browse the repository at this point in the history
  2. commit-graph: prepare for commit-graph chains

    To prepare for a chain of commit-graph files, augment the
    commit_graph struct to point to a base commit_graph. As we load
    commits from the graph, we may actually want to read from a base
    file according to the graph position.
    
    The "graph position" of a commit is given by concatenating the
    lexicographic commit orders from each of the commit-graph files in
    the chain. This means that we must distinguish two values:
    
     * lexicographic index : the position within the lexicographic
       order in a single commit-graph file.
    
     * graph position: the position within the concatenated order
       of multiple commit-graph files
    
    Given the lexicographic index of a commit in a graph, we can
    compute the graph position by adding the number of commits in
    the lower-level graphs. To find the lexicographic index of
    a commit, we subtract the number of commits in lower-level graphs.
    
    While here, change insert_parent_or_die() to take a uint32_t
    position, as that is the type used by its only caller and that
    makes more sense with the limits in the commit-graph format.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    d4f4d60 View commit details
    Browse the repository at this point in the history
  3. commit-graph: rename commit_compare to oid_compare

    The helper function commit_compare() actually compares object_id
    structs, not commits. A future change to commit-graph.c will need
    to sort commit structs, so rename this function in advance.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    3cbc6ed View commit details
    Browse the repository at this point in the history
  4. commit-graph: load commit-graph chains

    Prepare the logic for reading a chain of commit-graphs.
    
    First, look for a file at $OBJDIR/info/commit-graph. If it exists,
    then use that file and stop.
    
    Next, look for the chain file at $OBJDIR/info/commit-graphs/commit-graph-chain.
    If this file exists, then load the hash values as line-separated values in that
    file and load $OBJDIR/info/commit-graphs/graph-{hash[i]}.graph for each hash[i]
    in that file. The file is given in order, so the first hash corresponds to the
    "base" file and the final hash corresponds to the "tip" file.
    
    This implementation assumes that all of the graph-{hash}.graph files are in
    the same object directory as the commit-graph-chain file. This will be updated
    in a future change. This change is purposefully simple so we can isolate the
    different concerns.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    5c84b33 View commit details
    Browse the repository at this point in the history
  5. commit-graph: add base graphs chunk

    To quickly verify a commit-graph chain is valid on load, we will
    read from the new "Base Graphs Chunk" of each file in the chain.
    This will prevent accidentally loading incorrect data from manually
    editing the commit-graph-chain file or renaming graph-{hash}.graph
    files.
    
    The commit_graph struct already had an object_id struct "oid", but
    it was never initialized or used. Add a line to read the hash from
    the end of the commit-graph file and into the oid member.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    118bd57 View commit details
    Browse the repository at this point in the history
  6. commit-graph: rearrange chunk count logic

    The number of chunks in a commit-graph file can change depending on
    whether we need the Extra Edges Chunk. We are going to add more optional
    chunks, and it will be helpful to rearrange this logic around the chunk
    count before doing so.
    
    Specifically, we need to finalize the number of chunks before writing
    the commit-graph header. Further, we also need to fill out the chunk
    lookup table dynamically and using "num_chunks" as we add optional
    chunks is useful for adding optional chunks in the future.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    144354b View commit details
    Browse the repository at this point in the history
  7. commit-graph: write commit-graph chains

    Extend write_commit_graph() to write a commit-graph chain when given the
    COMMIT_GRAPH_SPLIT flag.
    
    This implementation is purposefully simplistic in how it creates a new
    chain. The commits not already in the chain are added to a new tip
    commit-graph file.
    
    Much of the logic around writing a graph-{hash}.graph file and updating
    the commit-graph-chain file is the same as the commit-graph file case.
    However, there are several places where we need to do some extra logic
    in the split case.
    
    Track the list of graph filenames before and after the planned write.
    This will be more important when we start merging graph files, but it
    also allows us to upgrade our commit-graph file to the appropriate
    graph-{hash}.graph file when we upgrade to a chain of commit-graphs.
    
    Note that we use the eighth byte of the commit-graph header to store the
    number of base graph files. This determines the length of the base
    graphs chunk.
    
    A subtle change of behavior with the new logic is that we do not write a
    commit-graph if we our commit list is empty. This extends to the typical
    case, which is reflected in t5318-commit-graph.sh.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    6c622f9 View commit details
    Browse the repository at this point in the history
  8. commit-graph: add --split option to builtin

    Add a new "--split" option to the 'git commit-graph write' subcommand. This
    option allows the optional behavior of writing a commit-graph chain.
    
    The current behavior will add a tip commit-graph containing any commits that
    are not in the existing commit-graph or commit-graph chain. Later changes
    will allow merging the chain and expiring out-dated files.
    
    Add a new test script (t5324-split-commit-graph.sh) that demonstrates this
    behavior.
    
    Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    135a712 View commit details
    Browse the repository at this point in the history
  9. commit-graph: merge commit-graph chains

    When searching for a commit in a commit-graph chain of G graphs with N
    commits, the search takes O(G log N) time. If we always add a new tip
    graph with every write, the linear G term will start to dominate and
    slow the lookup process.
    
    To keep lookups fast, but also keep most incremental writes fast, create
    a strategy for merging levels of the commit-graph chain. The strategy is
    detailed in the commit-graph design document, but is summarized by these
    two conditions:
    
      1. If the number of commits we are adding is more than half the number
         of commits in the graph below, then merge with that graph.
    
      2. If we are writing more than 64,000 commits into a single graph,
         then merge with all lower graphs.
    
    The numeric values in the conditions above are currently constant, but
    can become config options in a future update.
    
    As we merge levels of the commit-graph chain, check that the commits
    still exist in the repository. A garbage-collection operation may have
    removed those commits from the object store and we do not want to
    persist them in the commit-graph chain. This is a non-issue if the
    'git gc' process wrote a new, single-level commit-graph file.
    
    After we merge levels, the old graph-{hash}.graph files are no longer
    referenced by the commit-graph-chain file. We will expire these files in
    a future change.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    1771be9 View commit details
    Browse the repository at this point in the history
  10. commit-graph: allow cross-alternate chains

    In an environment like a fork network, it is helpful to have a
    commit-graph chain that spans both the base repo and the fork repo. The
    fork is usually a small set of data on top of the large repo, but
    sometimes the fork is much larger. For example, git-for-windows/git has
    almost double the number of commits as git/git because it rebases its
    commits on every major version update.
    
    To allow cross-alternate commit-graph chains, we need a few pieces:
    
    1. When looking for a graph-{hash}.graph file, check all alternates.
    
    2. When merging commit-graph chains, do not merge across alternates.
    
    3. When writing a new commit-graph chain based on a commit-graph file
       in another object directory, do not allow success if the base file
       has of the name "commit-graph" instead of
       "commit-graphs/graph-{hash}.graph".
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    c523035 View commit details
    Browse the repository at this point in the history
  11. commit-graph: expire commit-graph files

    As we merge commit-graph files in a commit-graph chain, we should clean
    up the files that are no longer used.
    
    This change introduces an 'expiry_window' value to the context, which is
    always zero (for now). We then check the modified time of each
    graph-{hash}.graph file in the $OBJDIR/info/commit-graphs folder and
    unlink the files that are older than the expiry_window.
    
    Since this is always zero, this immediately clears all unused graph
    files. We will update the value to match a config setting in a future
    change.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    8d84097 View commit details
    Browse the repository at this point in the history
  12. commit-graph: create options for split files

    The split commit-graph feature is now fully implemented, but needs
    some more run-time configurability. Allow direct callers to 'git
    commit-graph write --split' to specify the values used in the
    merge strategy and the expire time.
    
    Update the documentation to specify these values.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    c2bc6e6 View commit details
    Browse the repository at this point in the history
  13. commit-graph: verify chains with --shallow mode

    If we wrote a commit-graph chain, we only modified the tip file in
    the chain. It is valuable to verify what we wrote, but not waste
    time checking files we did not write.
    
    Add a '--shallow' option to the 'git commit-graph verify' subcommand
    and check that it does not read the base graph in a two-file chain.
    
    Making the verify subcommand read from a chain of commit-graphs takes
    some rearranging of the builtin code.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    3da4b60 View commit details
    Browse the repository at this point in the history
  14. commit-graph: clean up chains after flattened write

    If we write a commit-graph file without the split option, then
    we write to $OBJDIR/info/commit-graph and start to ignore
    the chains in $OBJDIR/info/commit-graphs/.
    
    Unlink the commit-graph-chain file and expire the graph-{hash}.graph
    files in $OBJDIR/info/commit-graphs/ during every write.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    ba41112 View commit details
    Browse the repository at this point in the history
  15. commit-graph: test octopus merges with --split

    Octopus merges require an extra chunk of data in the commit-graph
    file format. Create a test that ensures the new --split option
    continues to work with an octopus merge. Specifically, ensure
    that the octopus merge has parents across layers to truly check
    that our graph position logic holds up correctly.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    e2017c4 View commit details
    Browse the repository at this point in the history
  16. commit-graph: test --split across alternate without --split

    We allow sharing commit-graph files across alternates. When we are
    writing a split commit-graph, we allow adding tip graph files that
    are not in the alternate, but include commits from our local repo.
    
    However, if our alternate is not using the split commit-graph format,
    its file is at .git/objects/info/commit-graph and we are trying to
    write files in .git/objects/info/commit-graphs/graph-{hash}.graph.
    
    We already have logic to ensure we do not merge across alternate
    boundaries, but we also cannot have a commit-graph chain to our
    alternate if uses the old filename structure.
    
    Create a test that verifies we create a new split commit-graph
    with only one level and we do not modify the existing commit-graph
    in the alternate.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    a09c130 View commit details
    Browse the repository at this point in the history
  17. commit-graph: normalize commit-graph filenames

    When writing commit-graph files, we append path data to an
    object directory, which may be specified by the user via the
    '--object-dir' option. If the user supplies a trailing slash,
    or some other alternative path format, the resulting path may
    be usable for writing to the correct location. However, when
    expiring graph files from the <obj-dir>/info/commit-graphs
    directory during a write, we need to compare paths with exact
    string matches.
    
    Normalize the commit-graph filenames to avoid ambiguity. This
    creates extra allocations, but this is a constant multiple of
    the number of commit-graph files, which should be a number in
    the single digits.
    
    Further normalize the object directory in the context. Due to
    a comparison between g->obj_dir and ctx->obj_dir in
    split_graph_merge_strategy(), a trailing slash would prevent
    any merging of layers within the same object directory. The
    check is there to ensure we do not merge across alternates.
    Update the tests to include a case with this trailing slash
    problem.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    16110c9 View commit details
    Browse the repository at this point in the history
  18. commit-graph: test verify across alternates

    The 'git commit-graph verify' subcommand loads a commit-graph from
    a given object directory instead of using the standard method
    prepare_commit_graph(). During development of load_commit_graph_chain(),
    a version did not include prepare_alt_odb() as it was previously
    run by prepare_commit_graph() in most cases.
    
    Add a test that prevents that mistake from happening again.
    
    Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    derrickstolee authored and gitster committed Jun 20, 2019
    Configuration menu
    Copy the full SHA
    5b15eb3 View commit details
    Browse the repository at this point in the history
Loading