Skip to content

Commit

Permalink
fix some LibGit2 errors (#20155)
Browse files Browse the repository at this point in the history
fix some LibGit2 errors (wrong name for DiffOptionsStruct, missing cached kwarg). Add some tests for the above.
  • Loading branch information
simonbyrne authored Jan 21, 2017
1 parent 8ef1352 commit 2b891b7
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 9 deletions.
6 changes: 3 additions & 3 deletions base/libgit2/diff.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
function Base.cconvert(::Type{Ptr{DiffOptionsStruct}}, pathspecs::AbstractString)
str_ref = Base.cconvert(Ref{Cstring}, [pathspecs])
sa = StrArrayStruct(Base.unsafe_convert(Ref{Cstring}, str_ref), 1)
do_ref = Ref(DiffOptions(pathspec = sa))
do_ref = Ref(DiffOptionsStruct(pathspec = sa))
do_ref, str_ref
end
function Base.unsafe_convert(::Type{Ptr{DiffOptionsStruct}}, rr::Tuple{Ref{DiffOptionsStruct}, Ref{Cstring}})
Base.unsafe_convert(Ptr{DiffOptionStruct}, first(rr))
Base.unsafe_convert(Ptr{DiffOptionsStruct}, first(rr))
end


Expand Down Expand Up @@ -42,6 +42,6 @@ function Base.getindex(diff::GitDiff, i::Integer)
delta_ptr = ccall((:git_diff_get_delta, :libgit2),
Ptr{DiffDelta},
(Ptr{Void}, Csize_t), diff.ptr, i-1)
delta_ptr == C_NULL && return nothing
delta_ptr == C_NULL && throw(BoundsError(diff, (i,)))
return unsafe_load(delta_ptr)
end
24 changes: 18 additions & 6 deletions base/libgit2/libgit2.jl
Original file line number Diff line number Diff line change
Expand Up @@ -73,22 +73,34 @@ function iscommit(id::AbstractString, repo::GitRepo)
return res
end

""" git diff-index HEAD [-- <path>]"""
"""
LibGit2.isdirty(repo::GitRepo[, paths]; cached=false)
Checks if there have been any changes to tracked files in the working tree (if
`cached=false`) or the index (if `cached=true`).
See `git diff-index HEAD [-- <path>]`
"""
isdirty(repo::GitRepo, paths::AbstractString=""; cached::Bool=false) =
isdiff(repo, Consts.HEAD_FILE, paths, cached=cached)

""" git diff-index <treeish> [-- <path>]"""
"""
LibGit2.isdiff(repo::GitRepo, treeish[, paths]; cached=false)
Checks if there are any differences between the tree specified by `treeish` and the
tracked files in the working tree (if `cached=false`) or the index (if `cached=true`).
See `git diff-index <treeish> [-- <path>]`
"""
function isdiff(repo::GitRepo, treeish::AbstractString, paths::AbstractString=""; cached::Bool=false)
tree_oid = revparseid(repo, "$treeish^{tree}")
iszero(tree_oid) && return true
iszero(tree_oid) && error("invalid treeish $treeish") # this can be removed by #20104
result = false
tree = get(GitTree, repo, tree_oid)
try
diff = diff_tree(repo, tree, paths)
diff = diff_tree(repo, tree, paths, cached=cached)
result = count(diff) > 0
close(diff)
catch err
result = true
finally
close(tree)
end
Expand Down
35 changes: 35 additions & 0 deletions test/libgit2.jl
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,41 @@ mktempdir() do dir
close(repo)
end
end

@testset "diff" begin
repo = LibGit2.GitRepo(cache_repo)
try
@test !LibGit2.isdirty(repo)
@test !LibGit2.isdirty(repo, test_file)
@test !LibGit2.isdirty(repo, "nonexistent")
@test !LibGit2.isdiff(repo, "HEAD")
@test !LibGit2.isdirty(repo, cached=true)
@test !LibGit2.isdirty(repo, test_file, cached=true)
@test !LibGit2.isdirty(repo, "nonexistent", cached=true)
@test !LibGit2.isdiff(repo, "HEAD", cached=true)
open(joinpath(cache_repo,test_file), "a") do f
println(f, "zzzz")
end
@test LibGit2.isdirty(repo)
@test LibGit2.isdirty(repo, test_file)
@test !LibGit2.isdirty(repo, "nonexistent")
@test LibGit2.isdiff(repo, "HEAD")
@test !LibGit2.isdirty(repo, cached=true)
@test !LibGit2.isdiff(repo, "HEAD", cached=true)
LibGit2.add!(repo, test_file)
@test LibGit2.isdirty(repo)
@test LibGit2.isdiff(repo, "HEAD")
@test LibGit2.isdirty(repo, cached=true)
@test LibGit2.isdiff(repo, "HEAD", cached=true)
LibGit2.commit(repo, "zzz")
@test !LibGit2.isdirty(repo)
@test !LibGit2.isdiff(repo, "HEAD")
@test !LibGit2.isdirty(repo, cached=true)
@test !LibGit2.isdiff(repo, "HEAD", cached=true)
finally
close(repo)
end
end
end

@testset "Fetch from cache repository" begin
Expand Down

0 comments on commit 2b891b7

Please sign in to comment.