Skip to content

fix: resolve gitdir for LFS tmp path in submodule contexts#62

Open
thevinchi wants to merge 1 commit into
awslabs:mainfrom
fduplex-forks:fix/lfs-submodule-tmp-path
Open

fix: resolve gitdir for LFS tmp path in submodule contexts#62
thevinchi wants to merge 1 commit into
awslabs:mainfrom
fduplex-forks:fix/lfs-submodule-tmp-path

Conversation

@thevinchi
Copy link
Copy Markdown

Issue #, if available: #61

Description of changes:

The LFS custom transfer agent hardcoded .git/lfs/tmp as a literal path, which fails in submodule worktrees where .git is a gitlink file rather than a directory:

error transferring "<oid>": [2] [Errno 20] Not a directory: '<worktree>/<sub>/.git/lfs/tmp/<oid>.<suffix>'

In a submodule, <sub>/.git is a regular file containing gitdir: ../../.git/modules/<path> rather than a directory, so paths constructed by string concatenation through .git/... are invalid. This PR resolves the gitdir at runtime via git rev-parse --absolute-git-dir, which follows the gitlink and returns the real path under the parent's .git/modules/<path>/.

Changes:

  • git_remote_s3/lfs.py
    • Added _resolve_git_dir() helper.
    • Replaced os.path.abspath(".git/lfs/tmp") in LFSProcess.download() with the resolved gitdir, plus os.makedirs(..., exist_ok=True) so a fresh submodule gitdir works.
    • Moved the module-level logging.basicConfig into _configure_logging() called from main(), so the agent log path is also resolved correctly (with a graceful fallback if the gitdir can't be located).
  • test/lfs_test.py (new) — 4 tests:
    • _resolve_git_dir() in a normal repo returns an absolute path matching <tmp>/.git.
    • _resolve_git_dir() in a real submodule (created with git init + git submodule add in a tempdir) returns the path under <parent>/.git/modules/sub, proving the gitlink is followed.
    • _resolve_git_dir() invokes git rev-parse --absolute-git-dir (mock-based contract test).
    • download() constructs temp_dir from the resolved gitdir and creates it (mock-based).

Verification:

  • pytest test/ — 52 passed; the single failure (test_simultaneous_pushes_single_bundle_remains) is pre-existing on main and unrelated.
  • black --check, flake8, mypy — all clean on the modified files (mypy reports the same 4 pre-existing errors as main).

Fixes #61

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

The LFS custom transfer agent hardcoded ".git/lfs/tmp" as a literal
path, which fails in submodule worktrees where .git is a gitlink file
rather than a directory ("OSError [Errno 20] Not a directory"). Replace
with `git rev-parse --absolute-git-dir` so the real gitdir under the
parent's .git/modules/<path>/ is resolved.

Defer module-level logging.basicConfig into _configure_logging() called
from main() so the same resolution applies to the agent log file path.

Add unit + integration tests covering the gitdir resolution and the
download() temp-dir construction.

Fixes awslabs#61
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LFS download in submodules fails: hardcoded .git/lfs/tmp path doesn't resolve gitlink file

1 participant