/usr/share/julia/test/gitutils.jl is in julia-common 0.4.7-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # This file is a part of Julia. License is MIT: http://julialang.org/license
function write_and_readchomp(data, cmd::Cmd)
r, w, p = readandwrite(cmd)
print(w,data); close(w)
v = readchomp(r)
wait(p)
return v
end
function mktree(d::Dict)
lstree = ""
for (name, data) in d
if isa(data, AbstractString)
sha1 = write_and_readchomp(data, `git hash-object -w --stdin`)
lstree *= "100644 blob $sha1\t$name\n"
elseif isa(data, Dict)
sha1 = mktree(data)
lstree *= "040000 tree $sha1\t$name\n"
elseif is(data, nothing)
# ignore it
else
error("mktree: don't know what to do with $name => $data")
end
end
write_and_readchomp(lstree, `git mktree`)
end
function verify_tree(d::Dict, tree::AbstractString)
# check that tree matches d
seen = Set()
for line in eachline(`git ls-tree $tree`)
m = match(r"^(\d{6}) (\w+) ([0-9a-f]{40})\t(.*)$", line)
@test m != nothing
perm, kind, sha1, name = m.captures
@test haskey(d,name)
data = d[name]
if isa(data, AbstractString)
@test kind == "blob"
@test data == readall(`git cat-file blob $sha1`)
elseif isa(data, Dict)
@test kind == "tree"
verify_tree(data, sha1)
else
error("verify_tree: don't know what to do with $name => $data")
end
push!(seen, name)
end
# check that nothing was missing from tree
for (name, data) in d
@test is(data,nothing) || in(name,seen)
end
end
function verify_work(d::Dict)
# check what's in d
for (name, data) in d
if is(data, nothing)
@test !ispath(name)
continue
end
@test ispath(name)
if isa(data, AbstractString)
@test isfile(name)
@test readall(name) == data
elseif isa(data, Dict)
cd(name) do
verify_work(data)
end
else
error("verify_work: don't know what to do with $name => $data")
end
end
# check for anything that's not in d
extrapath = @windows? joinpath(JULIA_HOME,"..","Git","usr","bin")*";" : ""
withenv("PATH" => extrapath * ENV["PATH"]) do
for line in eachline(`ls -A`)
name = chomp(line)
@test name == ".git" || haskey(d,name)
end
end
end
function git_verify(h::Dict, i::Dict, w::Dict)
verify_tree(h, "HEAD")
verify_tree(i, readchomp(`git write-tree`))
verify_work(w)
end
function git_setup(h::Dict, i::Dict, w::Dict, parents::AbstractString...)
# create tree objects
headt = mktree(h)
index = mktree(i)
work = mktree(w)
# clear the repo
extrapath = @windows? joinpath(JULIA_HOME,"..","Git","usr","bin")*";" : ""
withenv("PATH" => extrapath * ENV["PATH"]) do
for line in eachline(`ls -A`)
name = chomp(line)
name == ".git" || rm(name, recursive=true)
end
end
# create the head commit
commit_tree = `git commit-tree $headt`
for parent in parents
commit_tree = `$commit_tree -p $parent`
end
head = write_and_readchomp(headt, commit_tree)
run(`git reset -q --soft $head`)
run(`git read-tree $work`) # read work into the index
run(`git checkout-index -fa`) # check the index out
run(`git read-tree $index`) # setup the index
# verify that everything is as expected
git_verify(h, i, w)
end
git_setup(h::Dict, i::Dict, w::Dict) = git_setup(h, i, w, readchomp(`git rev-parse HEAD`))
|