module Lib.Git.Tree
	( treeList
	, Perms
	, permsOfString
	, Treeent
	) where

import Lib.Git.Type
import Data.Maybe

type Perms = (Int, Int, Int, Int, Int, Int) -- find something better
type Treeent = [ (Perms, Object, FilePath) ]

permsOfString :: String -> Perms
permsOfString s =
	case map (read . replicate 1) s of
		[ a, b, c, d, e, f ] -> (a, b, c, d, e, f)
		_                    -> (0, 0, 0, 0, 0, 0)

split :: Char -> String -> [String]
split _     []       = [""]
split delim (c:cs)
	| c == delim = "" : rest
	| otherwise  = (c : head rest) : tail rest
	where
		rest = split delim cs

-- | return a tree entity from a commitid
-- if commitid is ommitted, it uses HEAD.
treeList :: Maybe CommitID -> GitCtx Treeent
treeList commitid = do
	let treeent_of_line line =
		-- parse persmission SP type SP SHA1 SP filename
		case split '\t' line of
			[ o, filename ]    ->
				case split ' ' o of
					[ perms, ty, sha1 ] ->
						let object = fromJust $ objOfString ty sha1 in
						Just (permsOfString perms, object, filename)
					_                   -> Nothing
			_                  -> Nothing
	let comm = fromMaybe "HEAD" commitid
	let opts = [ comm ]
	o <- gitExec "ls-tree" opts []
	case o of
		Right out -> return (mapMaybe treeent_of_line $ lines out)
		Left err  -> gitError err "ls-tree"