-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
status.jl
34 lines (30 loc) · 1.37 KB
/
status.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# This file is a part of Julia. License is MIT: http://julialang.org/license
function GitStatus(repo::GitRepo; status_opts=StatusOptions())
stat_ptr_ptr = Ref{Ptr{Void}}(C_NULL)
@check ccall((:git_status_list_new, :libgit2), Cint,
(Ptr{Ptr{Void}}, Ptr{Void}, Ptr{StatusOptions}),
stat_ptr_ptr, repo.ptr, Ref(status_opts))
return GitStatus(stat_ptr_ptr[])
end
function Base.length(status::GitStatus)
return Int(ccall((:git_status_list_entrycount, :libgit2), Csize_t,
(Ptr{Ptr{Void}}, ), status.ptr))
end
function Base.getindex(status::GitStatus, i::Csize_t)
if i < 1 || i > length(status)
throw(BoundsError())
end
entry_ptr = ccall((:git_status_byindex, :libgit2), Ptr{Void},
(Ptr{Void}, Csize_t), status.ptr, i-1)
entry_ptr == C_NULL && throw(Error.GitError(Error.ERROR))
return unsafe_load(convert(Ptr{StatusEntry}, entry_ptr), 1)
end
Base.getindex(status::GitStatus, i::Int) = getindex(status, Csize_t(i))
function status(repo::GitRepo, path::String)
status_ptr = Ref{Cuint}(0)
ret = ccall((:git_status_file, :libgit2), Cint,
(Ref{Cuint}, Ptr{Void}, Cstring),
status_ptr, repo.ptr, path)
(ret == Cint(Error.ENOTFOUND) || ret == Cint(Error.EAMBIGUOUS)) && return Nullable{Cuint}()
return Nullable(status_ptr[])
end