You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.8 KiB
55 lines
1.8 KiB
namespace git_guts
|
|
|
|
open System.IO
|
|
open System.Collections.Generic
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
[<AutoOpen>]
|
|
module Pack =
|
|
|
|
let internal _dumpPackFile fname findRepoObjRecFunc =
|
|
|
|
// initialize
|
|
if not ( File.Exists fname ) then
|
|
failwithf "Can't find pack file: %s" fname
|
|
|
|
// figure out what to do
|
|
let extn = Path.GetExtension( fname ).ToLower()
|
|
if extn = ".pack" then
|
|
_dumpPackDataFile fname findRepoObjRecFunc
|
|
else if extn = ".idx" then
|
|
_dumpPackIndexFile fname
|
|
else
|
|
failwithf "Unknown pack file extension: %s" extn
|
|
|
|
let _readPackObjRec fname objName findRepoObjRecFunc =
|
|
let fpos = _findObjInPack fname objName
|
|
if fpos.IsNone then
|
|
None
|
|
else
|
|
// read the object from the pack
|
|
let fname2 = changeExtn fname ".pack"
|
|
use inp = new FileStream( fname2, FileMode.Open, FileAccess.Read, FileShare.Read )
|
|
inp.Seek( int64( fpos.Value ), SeekOrigin.Begin ) |> ignore
|
|
let objRec, fpos2 = _readPackObjRec inp findRepoObjRecFunc
|
|
Some objRec
|
|
|
|
let readPackObject fname objName findRepoObjRecFunc :GitObject option =
|
|
let objRec = _readPackObjRec fname objName findRepoObjRecFunc
|
|
if objRec.IsNone then
|
|
None
|
|
else
|
|
Some ( makeGitObject objRec.Value )
|
|
|
|
let _dumpPackObject fname objName findRepoObjRecFunc =
|
|
|
|
// initialize
|
|
if not ( File.Exists fname ) then
|
|
failwithf "Can't find pack file: %s" fname
|
|
|
|
// find the specified pack object
|
|
let obj = readPackObject fname objName findRepoObjRecFunc
|
|
if obj.IsNone then
|
|
failwith "Object not found."
|
|
obj.Value.dumpObj()
|
|
|