Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multi-pack-index: use real paths for --object-dir #498

Merged

Commits on Apr 21, 2022

  1. midx: use real paths in lookup_multi_pack_index()

    This helper looks for a parsed multi-pack-index whose object directory
    matches the given object_dir. Before going into the loop over the parsed
    multi-pack-indexes, it calls find_odb() to ensure that the given
    object_dir is actually a known object directory.
    
    However, find_odb() uses real-path manipulations to compare the input to
    the alternate directories. This same real-path comparison is not used in
    the loop, leading to potential issues with the strcmp().
    
    Update the method to use the real-path values instead.
    
    Signed-off-by: Derrick Stolee <derrickstolee@github.com>
    derrickstolee committed Apr 21, 2022
    Configuration menu
    Copy the full SHA
    34785a0 View commit details
    Browse the repository at this point in the history

Commits on Apr 25, 2022

  1. multi-pack-index: use --object-dir real path

    The --object-dir argument to 'git multi-pack-index' allows a user to
    specify an alternate to use instead of the local $GITDIR. This is used
    by third-party tools like VFS for Git to maintain the pack-files in a
    "shared object cache" used by multiple clones.
    
    On Windows, the user can specify a path using a Windows-style file path
    with backslashes such as "C:\Path\To\ObjectDir". This same path style is
    used in the .git/objects/info/alternates file, so it already matches the
    path of that alternate. However, find_odb() converts these paths to
    real-paths for the comparison, which use forward slashes. As of the
    previous change, lookup_multi_pack_index() uses real-paths, so it
    correctly finds the target multi-pack-index when given these paths.
    
    Some commands such as 'git multi-pack-index repack' call child processes
    using the object_dir value, so it can be helpful to convert the path to
    the real-path before sending it to those locations.
    
    Add a callback to convert the real path immediately upon parsing the
    argument. We need to be careful that we don't store the exact value out
    of get_object_directory() and free it, or we could corrupt a later use
    of the_repository->objects->odb->path.
    
    We don't use get_object_directory() for the initial instantiation in
    cmd_multi_pack_index() because we need 'git multi-pack-index -h' to work
    without a Git repository.
    
    Signed-off-by: Derrick Stolee <derrickstolee@github.com>
    derrickstolee committed Apr 25, 2022
    Configuration menu
    Copy the full SHA
    fd580e7 View commit details
    Browse the repository at this point in the history
  2. cache: use const char * for get_object_directory()

    The get_object_directory() method returns the exact string stored at
    the_repository->objects->odb->path. The return type of "char *" implies
    that the caller must keep track of the buffer and free() it when
    complete. This causes significant problems later when the ODB is
    accessed.
    
    Use "const char *" as the return type to avoid this confusion. There are
    no current callers that care about the non-const definition.
    
    Signed-off-by: Derrick Stolee <derrickstolee@github.com>
    derrickstolee committed Apr 25, 2022
    Configuration menu
    Copy the full SHA
    c9b13f0 View commit details
    Browse the repository at this point in the history