diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 20c6d0f..37df514 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,6 +51,9 @@ jobs: - os: ubuntu-22.04-arm arch: 'default' version: 'nightly' + - os: windows-latest + arch: 'default' + version: '1.7.3' steps: - uses: actions/checkout@v4 - uses: julia-actions/setup-julia@v2 diff --git a/Project.toml b/Project.toml index f38bd84..e0c9962 100644 --- a/Project.toml +++ b/Project.toml @@ -1,14 +1,16 @@ name = "Git" uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" -version = "1.4.0" authors = ["Dilum Aluthge", "contributors"] +version = "1.5.0" [deps] +Git_LFS_jll = "020c3dae-16b3-5ae5-87b3-4cb189e250b2" Git_jll = "f8c6e375-362e-5223-8a59-34ff63f689eb" JLLWrappers = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" OpenSSH_jll = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" [compat] +Git_LFS_jll = "3.7" Git_jll = "2.44" JLLWrappers = "1.1" OpenSSH_jll = "9, 10" diff --git a/README.md b/README.md index 337a302..e9d4866 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ not need to have Git installed on your computer, and neither do the users of your packages! Git.jl provides a Git binary via -[Git_jll.jl](https://github.com/JuliaBinaryWrappers/Git_jll.jl). +[Git_jll.jl](https://github.com/JuliaBinaryWrappers/Git_jll.jl) +and a Git LFS binary for large file support via +[Git_LFS_jll.jl](https://github.com/JuliaBinaryWrappers/Git_LFS_jll.jl). The latest version of Git.jl requires at least Julia 1.6. Git.jl is intended to work on any platform that supports Julia, diff --git a/src/git_function.jl b/src/git_function.jl index 1e34733..b4fd1e6 100644 --- a/src/git_function.jl +++ b/src/git_function.jl @@ -1,4 +1,5 @@ using OpenSSH_jll: OpenSSH_jll +using Git_LFS_jll: Git_LFS_jll using JLLWrappers: pathsep, LIBPATH_env """ @@ -67,6 +68,19 @@ function git(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true) git_cmd = addenv(git_cmd, "PATH" => join(path, pathsep), LIBPATH_env => join(libpath, pathsep)) end + # Add git-lfs + if Git_LFS_jll.is_available() + # Read path from git_cmd.env as it can be modified above + idx = findfirst(startswith("PATH="), git_cmd.env) + path = if isnothing(idx) + "" + else + # dropping the `PATH=` part + git_cmd.env[idx][6:end] + end + path = vcat(dirname(Git_LFS_jll.git_lfs_path), path) + git_cmd = addenv(git_cmd, "PATH" => join(path, pathsep))::Cmd + end return git_cmd end diff --git a/test/runtests.jl b/test/runtests.jl index 1b1516f..75c61ea 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -34,6 +34,20 @@ end @test isdir("Git.jl") @test isfile(joinpath("Git.jl", "Project.toml")) end + + # git-lfs tests + withtempdir() do tmp_dir + rname = "repo-with-large-file-storage" + @test !isdir(rname) + @test !isfile(joinpath(rname, "LargeFile.zip")) + run(`$(git()) clone --quiet https://github.com/Apress/repo-with-large-file-storage`) + run(pipeline(`$(git()) -C $rname lfs install --local`; stdout=devnull)) + run(pipeline(`$(git()) -C $rname lfs pull`; stdout=devnull)) + @test isdir(rname) + @test isfile(joinpath(rname, "LargeFile.zip")) + # Test filesize to make sure we got real file and not small LFS pointer file + @test filesize(joinpath(rname, "LargeFile.zip")) > 10^6 + end end @testset "Safety" begin