some cleanup of debug trace helpers
This commit is contained in:
parent
a61d49cca6
commit
70d87613f2
@ -495,7 +495,7 @@ journalCanonicaliseAmounts :: Journal -> Journal
|
|||||||
journalCanonicaliseAmounts j@Journal{jtxns=ts} = j''
|
journalCanonicaliseAmounts j@Journal{jtxns=ts} = j''
|
||||||
where
|
where
|
||||||
j'' = j'{jtxns=map fixtransaction ts}
|
j'' = j'{jtxns=map fixtransaction ts}
|
||||||
j' = j{jcommoditystyles = canonicalStyles $ dbgAt 8 "journalAmounts" $ journalAmounts j}
|
j' = j{jcommoditystyles = canonicalStyles $ dbg8 "journalAmounts" $ journalAmounts j}
|
||||||
fixtransaction t@Transaction{tpostings=ps} = t{tpostings=map fixposting ps}
|
fixtransaction t@Transaction{tpostings=ps} = t{tpostings=map fixposting ps}
|
||||||
fixposting p@Posting{pamount=a} = p{pamount=fixmixedamount a}
|
fixposting p@Posting{pamount=a} = p{pamount=fixmixedamount a}
|
||||||
fixmixedamount (Mixed as) = Mixed $ map fixamount as
|
fixmixedamount (Mixed as) = Mixed $ map fixamount as
|
||||||
|
|||||||
@ -126,9 +126,9 @@ readJournal format rulesfile assrt path s =
|
|||||||
firstSuccessOrBestError :: [String] -> [Reader] -> IO (Either String Journal)
|
firstSuccessOrBestError :: [String] -> [Reader] -> IO (Either String Journal)
|
||||||
firstSuccessOrBestError [] [] = return $ Left "no readers found"
|
firstSuccessOrBestError [] [] = return $ Left "no readers found"
|
||||||
firstSuccessOrBestError errs (r:rs) = do
|
firstSuccessOrBestError errs (r:rs) = do
|
||||||
dbgAtM 1 "trying reader" (rFormat r)
|
dbg1IO "trying reader" (rFormat r)
|
||||||
result <- (runExceptT . (rParser r) rulesfile assrt path') s
|
result <- (runExceptT . (rParser r) rulesfile assrt path') s
|
||||||
dbgAtM 1 "reader result" $ either id show result
|
dbg1IO "reader result" $ either id show result
|
||||||
case result of Right j -> return $ Right j -- success!
|
case result of Right j -> return $ Right j -- success!
|
||||||
Left e -> firstSuccessOrBestError (errs++[e]) rs -- keep trying
|
Left e -> firstSuccessOrBestError (errs++[e]) rs -- keep trying
|
||||||
firstSuccessOrBestError (e:_) [] = return $ Left e -- none left, return first error
|
firstSuccessOrBestError (e:_) [] = return $ Left e -- none left, return first error
|
||||||
@ -137,7 +137,7 @@ readJournal format rulesfile assrt path s =
|
|||||||
-- | Which readers are worth trying for this (possibly unspecified) format, filepath, and data ?
|
-- | Which readers are worth trying for this (possibly unspecified) format, filepath, and data ?
|
||||||
readersFor :: (Maybe StorageFormat, Maybe FilePath, String) -> [Reader]
|
readersFor :: (Maybe StorageFormat, Maybe FilePath, String) -> [Reader]
|
||||||
readersFor (format,path,s) =
|
readersFor (format,path,s) =
|
||||||
dbg ("possible readers for "++show (format,path,elideRight 30 s)) $
|
dbg1 ("possible readers for "++show (format,path,elideRight 30 s)) $
|
||||||
case format of
|
case format of
|
||||||
Just f -> case readerForStorageFormat f of Just r -> [r]
|
Just f -> case readerForStorageFormat f of Just r -> [r]
|
||||||
Nothing -> []
|
Nothing -> []
|
||||||
|
|||||||
@ -101,7 +101,7 @@ readJournalFromCsv mrulesfile csvfile csvdata =
|
|||||||
let rules = case rules_ of
|
let rules = case rules_ of
|
||||||
Right (t::CsvRules) -> t
|
Right (t::CsvRules) -> t
|
||||||
Left err -> throwerr $ show err
|
Left err -> throwerr $ show err
|
||||||
dbgAtM 2 "rules" rules
|
dbg2IO "rules" rules
|
||||||
|
|
||||||
-- apply skip directive
|
-- apply skip directive
|
||||||
let skip = maybe 0 oneorerror $ getDirective "skip" rules
|
let skip = maybe 0 oneorerror $ getDirective "skip" rules
|
||||||
@ -113,10 +113,10 @@ readJournalFromCsv mrulesfile csvfile csvdata =
|
|||||||
-- parsec seems to fail if you pass it "-" here
|
-- parsec seems to fail if you pass it "-" here
|
||||||
let parsecfilename = if csvfile == "-" then "(stdin)" else csvfile
|
let parsecfilename = if csvfile == "-" then "(stdin)" else csvfile
|
||||||
records <- (either throwerr id .
|
records <- (either throwerr id .
|
||||||
dbgAt 2 "validateCsv" . validateCsv skip .
|
dbg2 "validateCsv" . validateCsv skip .
|
||||||
dbgAt 2 "parseCsv")
|
dbg2 "parseCsv")
|
||||||
`fmap` parseCsv parsecfilename csvdata
|
`fmap` parseCsv parsecfilename csvdata
|
||||||
dbgAtM 1 "first 3 csv records" $ take 3 records
|
dbg1IO "first 3 csv records" $ take 3 records
|
||||||
|
|
||||||
-- identify header lines
|
-- identify header lines
|
||||||
-- let (headerlines, datalines) = identifyHeaderLines records
|
-- let (headerlines, datalines) = identifyHeaderLines records
|
||||||
|
|||||||
@ -823,7 +823,7 @@ numberp = do
|
|||||||
-- ptrace "numberp"
|
-- ptrace "numberp"
|
||||||
sign <- signp
|
sign <- signp
|
||||||
parts <- many1 $ choice' [many1 digit, many1 $ char ',', many1 $ char '.']
|
parts <- many1 $ choice' [many1 digit, many1 $ char ',', many1 $ char '.']
|
||||||
dbgAt 8 "numberp parsed" (sign,parts) `seq` return ()
|
dbg8 "numberp parsed" (sign,parts) `seq` return ()
|
||||||
|
|
||||||
-- check the number is well-formed and identify the decimal point and digit
|
-- check the number is well-formed and identify the decimal point and digit
|
||||||
-- group separator characters used, if any
|
-- group separator characters used, if any
|
||||||
@ -861,7 +861,7 @@ numberp = do
|
|||||||
frac' = if null frac then "0" else frac
|
frac' = if null frac then "0" else frac
|
||||||
quantity = read $ sign++int'++"."++frac' -- this read should never fail
|
quantity = read $ sign++int'++"."++frac' -- this read should never fail
|
||||||
|
|
||||||
return $ dbgAt 8 "numberp quantity,precision,mdecimalpoint,mgrps" (quantity,precision,mdecimalpoint,mgrps)
|
return $ dbg8 "numberp quantity,precision,mdecimalpoint,mgrps" (quantity,precision,mdecimalpoint,mgrps)
|
||||||
<?> "numberp"
|
<?> "numberp"
|
||||||
where
|
where
|
||||||
numeric = isNumber . headDef '_'
|
numeric = isNumber . headDef '_'
|
||||||
|
|||||||
@ -62,19 +62,19 @@ flatShowsExclusiveBalance = True
|
|||||||
balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
balanceReport :: ReportOpts -> Query -> Journal -> BalanceReport
|
||||||
balanceReport opts q j = (items, total)
|
balanceReport opts q j = (items, total)
|
||||||
where
|
where
|
||||||
-- dbg = const id -- exclude from debug output
|
-- dbg1 = const id -- exclude from debug output
|
||||||
dbg s = let p = "balanceReport" in Hledger.Utils.dbg (p++" "++s) -- add prefix in debug output
|
dbg1 s = let p = "balanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in debug output
|
||||||
|
|
||||||
accts = ledgerRootAccount $ ledgerFromJournal q $ journalSelectingAmountFromOpts opts j
|
accts = ledgerRootAccount $ ledgerFromJournal q $ journalSelectingAmountFromOpts opts j
|
||||||
accts' :: [Account]
|
accts' :: [Account]
|
||||||
| queryDepth q == 0 =
|
| queryDepth q == 0 =
|
||||||
dbg "accts" $
|
dbg1 "accts" $
|
||||||
take 1 $ clipAccountsAndAggregate (queryDepth q) $ flattenAccounts accts
|
take 1 $ clipAccountsAndAggregate (queryDepth q) $ flattenAccounts accts
|
||||||
| flat_ opts = dbg "accts" $
|
| flat_ opts = dbg1 "accts" $
|
||||||
filterzeros $
|
filterzeros $
|
||||||
filterempty $
|
filterempty $
|
||||||
drop 1 $ clipAccountsAndAggregate (queryDepth q) $ flattenAccounts accts
|
drop 1 $ clipAccountsAndAggregate (queryDepth q) $ flattenAccounts accts
|
||||||
| otherwise = dbg "accts" $
|
| otherwise = dbg1 "accts" $
|
||||||
filter (not.aboring) $
|
filter (not.aboring) $
|
||||||
drop 1 $ flattenAccounts $
|
drop 1 $ flattenAccounts $
|
||||||
markboring $
|
markboring $
|
||||||
@ -86,9 +86,9 @@ balanceReport opts q j = (items, total)
|
|||||||
filterempty = filter (\a -> anumpostings a > 0 || not (isZeroMixedAmount (balance a)))
|
filterempty = filter (\a -> anumpostings a > 0 || not (isZeroMixedAmount (balance a)))
|
||||||
prunezeros = if empty_ opts then id else fromMaybe nullacct . pruneAccounts (isZeroMixedAmount . balance)
|
prunezeros = if empty_ opts then id else fromMaybe nullacct . pruneAccounts (isZeroMixedAmount . balance)
|
||||||
markboring = if no_elide_ opts then id else markBoringParentAccounts
|
markboring = if no_elide_ opts then id else markBoringParentAccounts
|
||||||
items = dbg "items" $ map (balanceReportItem opts q) accts'
|
items = dbg1 "items" $ map (balanceReportItem opts q) accts'
|
||||||
total | not (flat_ opts) = dbg "total" $ sum [amt | ((_,_,indent),amt) <- items, indent == 0]
|
total | not (flat_ opts) = dbg1 "total" $ sum [amt | ((_,_,indent),amt) <- items, indent == 0]
|
||||||
| otherwise = dbg "total" $
|
| otherwise = dbg1 "total" $
|
||||||
if flatShowsExclusiveBalance
|
if flatShowsExclusiveBalance
|
||||||
then sum $ map snd items
|
then sum $ map snd items
|
||||||
else sum $ map aebalance $ clipAccountsAndAggregate 1 accts'
|
else sum $ map aebalance $ clipAccountsAndAggregate 1 accts'
|
||||||
|
|||||||
@ -73,41 +73,41 @@ type ClippedAccountName = AccountName
|
|||||||
multiBalanceReport :: ReportOpts -> Query -> Journal -> MultiBalanceReport
|
multiBalanceReport :: ReportOpts -> Query -> Journal -> MultiBalanceReport
|
||||||
multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totalsrow)
|
multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totalsrow)
|
||||||
where
|
where
|
||||||
symq = dbg "symq" $ filterQuery queryIsSym $ dbg "requested q" q
|
symq = dbg1 "symq" $ filterQuery queryIsSym $ dbg1 "requested q" q
|
||||||
depthq = dbg "depthq" $ filterQuery queryIsDepth q
|
depthq = dbg1 "depthq" $ filterQuery queryIsDepth q
|
||||||
depth = queryDepth depthq
|
depth = queryDepth depthq
|
||||||
depthless = dbg "depthless" . filterQuery (not . queryIsDepth)
|
depthless = dbg1 "depthless" . filterQuery (not . queryIsDepth)
|
||||||
datelessq = dbg "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
datelessq = dbg1 "datelessq" $ filterQuery (not . queryIsDateOrDate2) q
|
||||||
dateqcons = if date2_ opts then Date2 else Date
|
dateqcons = if date2_ opts then Date2 else Date
|
||||||
precedingq = dbg "precedingq" $ And [datelessq, dateqcons $ DateSpan Nothing (spanStart reportspan)]
|
precedingq = dbg1 "precedingq" $ And [datelessq, dateqcons $ DateSpan Nothing (spanStart reportspan)]
|
||||||
requestedspan = dbg "requestedspan" $ queryDateSpan (date2_ opts) q -- span specified by -b/-e/-p options and query args
|
requestedspan = dbg1 "requestedspan" $ queryDateSpan (date2_ opts) q -- span specified by -b/-e/-p options and query args
|
||||||
requestedspan' = dbg "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan (date2_ opts) j -- if open-ended, close it using the journal's end dates
|
requestedspan' = dbg1 "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan (date2_ opts) j -- if open-ended, close it using the journal's end dates
|
||||||
intervalspans = dbg "intervalspans" $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it
|
intervalspans = dbg1 "intervalspans" $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it
|
||||||
reportspan = dbg "reportspan" $ DateSpan (maybe Nothing spanStart $ headMay intervalspans) -- the requested span enlarged to a whole number of intervals
|
reportspan = dbg1 "reportspan" $ DateSpan (maybe Nothing spanStart $ headMay intervalspans) -- the requested span enlarged to a whole number of intervals
|
||||||
(maybe Nothing spanEnd $ lastMay intervalspans)
|
(maybe Nothing spanEnd $ lastMay intervalspans)
|
||||||
newdatesq = dbg "newdateq" $ dateqcons reportspan
|
newdatesq = dbg1 "newdateq" $ dateqcons reportspan
|
||||||
reportq = dbg "reportq" $ depthless $ And [datelessq, newdatesq] -- user's query enlarged to whole intervals and with no depth limit
|
reportq = dbg1 "reportq" $ depthless $ And [datelessq, newdatesq] -- user's query enlarged to whole intervals and with no depth limit
|
||||||
|
|
||||||
ps :: [Posting] =
|
ps :: [Posting] =
|
||||||
dbg "ps" $
|
dbg1 "ps" $
|
||||||
journalPostings $
|
journalPostings $
|
||||||
filterJournalAmounts symq $ -- remove amount parts excluded by cur:
|
filterJournalAmounts symq $ -- remove amount parts excluded by cur:
|
||||||
filterJournalPostings reportq $ -- remove postings not matched by (adjusted) query
|
filterJournalPostings reportq $ -- remove postings not matched by (adjusted) query
|
||||||
journalSelectingAmountFromOpts opts j
|
journalSelectingAmountFromOpts opts j
|
||||||
|
|
||||||
displayspans = dbg "displayspans" $ splitSpan (intervalFromOpts opts) displayspan
|
displayspans = dbg1 "displayspans" $ splitSpan (intervalFromOpts opts) displayspan
|
||||||
where
|
where
|
||||||
displayspan
|
displayspan
|
||||||
| empty_ opts = dbg "displayspan (-E)" $ reportspan -- all the requested intervals
|
| empty_ opts = dbg1 "displayspan (-E)" $ reportspan -- all the requested intervals
|
||||||
| otherwise = dbg "displayspan" $ requestedspan `spanIntersect` matchedspan -- exclude leading/trailing empty intervals
|
| otherwise = dbg1 "displayspan" $ requestedspan `spanIntersect` matchedspan -- exclude leading/trailing empty intervals
|
||||||
matchedspan = dbg "matchedspan" $ postingsDateSpan' (whichDateFromOpts opts) ps
|
matchedspan = dbg1 "matchedspan" $ postingsDateSpan' (whichDateFromOpts opts) ps
|
||||||
|
|
||||||
psPerSpan :: [[Posting]] =
|
psPerSpan :: [[Posting]] =
|
||||||
dbg "psPerSpan" $
|
dbg1 "psPerSpan" $
|
||||||
[filter (isPostingInDateSpan' (whichDateFromOpts opts) s) ps | s <- displayspans]
|
[filter (isPostingInDateSpan' (whichDateFromOpts opts) s) ps | s <- displayspans]
|
||||||
|
|
||||||
postedAcctBalChangesPerSpan :: [[(ClippedAccountName, MixedAmount)]] =
|
postedAcctBalChangesPerSpan :: [[(ClippedAccountName, MixedAmount)]] =
|
||||||
dbg "postedAcctBalChangesPerSpan" $
|
dbg1 "postedAcctBalChangesPerSpan" $
|
||||||
map postingAcctBals psPerSpan
|
map postingAcctBals psPerSpan
|
||||||
where
|
where
|
||||||
postingAcctBals :: [Posting] -> [(ClippedAccountName, MixedAmount)]
|
postingAcctBals :: [Posting] -> [(ClippedAccountName, MixedAmount)]
|
||||||
@ -120,36 +120,36 @@ multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totalsrow
|
|||||||
| tree_ opts = filter ((depthq `matchesAccount`).aname) -- exclude deeper balances
|
| tree_ opts = filter ((depthq `matchesAccount`).aname) -- exclude deeper balances
|
||||||
| otherwise = clipAccountsAndAggregate depth -- aggregate deeper balances at the depth limit
|
| otherwise = clipAccountsAndAggregate depth -- aggregate deeper balances at the depth limit
|
||||||
|
|
||||||
postedAccts :: [AccountName] = dbg "postedAccts" $ sort $ accountNamesFromPostings ps
|
postedAccts :: [AccountName] = dbg1 "postedAccts" $ sort $ accountNamesFromPostings ps
|
||||||
|
|
||||||
-- starting balances and accounts from transactions before the report start date
|
-- starting balances and accounts from transactions before the report start date
|
||||||
startacctbals = dbg "startacctbals" $ map (\((a,_,_),b) -> (a,b)) startbalanceitems
|
startacctbals = dbg1 "startacctbals" $ map (\((a,_,_),b) -> (a,b)) startbalanceitems
|
||||||
where
|
where
|
||||||
(startbalanceitems,_) = dbg "starting balance report" $ balanceReport opts' precedingq j
|
(startbalanceitems,_) = dbg1 "starting balance report" $ balanceReport opts' precedingq j
|
||||||
where
|
where
|
||||||
opts' | tree_ opts = opts{no_elide_=True}
|
opts' | tree_ opts = opts{no_elide_=True}
|
||||||
| otherwise = opts{accountlistmode_=ALFlat}
|
| otherwise = opts{accountlistmode_=ALFlat}
|
||||||
startingBalanceFor a = fromMaybe nullmixedamt $ lookup a startacctbals
|
startingBalanceFor a = fromMaybe nullmixedamt $ lookup a startacctbals
|
||||||
startAccts = dbg "startAccts" $ map fst startacctbals
|
startAccts = dbg1 "startAccts" $ map fst startacctbals
|
||||||
|
|
||||||
displayedAccts :: [ClippedAccountName] =
|
displayedAccts :: [ClippedAccountName] =
|
||||||
dbg "displayedAccts" $
|
dbg1 "displayedAccts" $
|
||||||
(if tree_ opts then expandAccountNames else id) $
|
(if tree_ opts then expandAccountNames else id) $
|
||||||
nub $ map (clipOrEllipsifyAccountName depth) $
|
nub $ map (clipOrEllipsifyAccountName depth) $
|
||||||
if empty_ opts then nub $ sort $ startAccts ++ postedAccts else postedAccts
|
if empty_ opts then nub $ sort $ startAccts ++ postedAccts else postedAccts
|
||||||
|
|
||||||
acctBalChangesPerSpan :: [[(ClippedAccountName, MixedAmount)]] =
|
acctBalChangesPerSpan :: [[(ClippedAccountName, MixedAmount)]] =
|
||||||
dbg "acctBalChangesPerSpan" $
|
dbg1 "acctBalChangesPerSpan" $
|
||||||
[sortBy (comparing fst) $ unionBy (\(a,_) (a',_) -> a == a') postedacctbals zeroes
|
[sortBy (comparing fst) $ unionBy (\(a,_) (a',_) -> a == a') postedacctbals zeroes
|
||||||
| postedacctbals <- postedAcctBalChangesPerSpan]
|
| postedacctbals <- postedAcctBalChangesPerSpan]
|
||||||
where zeroes = [(a, nullmixedamt) | a <- displayedAccts]
|
where zeroes = [(a, nullmixedamt) | a <- displayedAccts]
|
||||||
|
|
||||||
acctBalChanges :: [(ClippedAccountName, [MixedAmount])] =
|
acctBalChanges :: [(ClippedAccountName, [MixedAmount])] =
|
||||||
dbg "acctBalChanges" $
|
dbg1 "acctBalChanges" $
|
||||||
[(a, map snd abs) | abs@((a,_):_) <- transpose acctBalChangesPerSpan] -- never null, or used when null...
|
[(a, map snd abs) | abs@((a,_):_) <- transpose acctBalChangesPerSpan] -- never null, or used when null...
|
||||||
|
|
||||||
items :: [MultiBalanceReportRow] =
|
items :: [MultiBalanceReportRow] =
|
||||||
dbg "items" $
|
dbg1 "items" $
|
||||||
[((a, accountLeafName a, accountNameLevel a), displayedBals, rowtot, rowavg)
|
[((a, accountLeafName a, accountNameLevel a), displayedBals, rowtot, rowavg)
|
||||||
| (a,changes) <- acctBalChanges
|
| (a,changes) <- acctBalChanges
|
||||||
, let displayedBals = case balancetype_ opts of
|
, let displayedBals = case balancetype_ opts of
|
||||||
@ -162,18 +162,18 @@ multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totalsrow
|
|||||||
]
|
]
|
||||||
|
|
||||||
totals :: [MixedAmount] =
|
totals :: [MixedAmount] =
|
||||||
-- dbg "totals" $
|
-- dbg1 "totals" $
|
||||||
map sum balsbycol
|
map sum balsbycol
|
||||||
where
|
where
|
||||||
balsbycol = transpose [bs | ((a,_,_),bs,_,_) <- items, not (tree_ opts) || a `elem` highestlevelaccts]
|
balsbycol = transpose [bs | ((a,_,_),bs,_,_) <- items, not (tree_ opts) || a `elem` highestlevelaccts]
|
||||||
highestlevelaccts =
|
highestlevelaccts =
|
||||||
dbg "highestlevelaccts" $
|
dbg1 "highestlevelaccts" $
|
||||||
[a | a <- displayedAccts, not $ any (`elem` displayedAccts) $ init $ expandAccountName a]
|
[a | a <- displayedAccts, not $ any (`elem` displayedAccts) $ init $ expandAccountName a]
|
||||||
|
|
||||||
totalsrow :: MultiBalanceTotalsRow =
|
totalsrow :: MultiBalanceTotalsRow =
|
||||||
dbg "totalsrow" $
|
dbg1 "totalsrow" $
|
||||||
(totals, sum totals, averageMixedAmounts totals)
|
(totals, sum totals, averageMixedAmounts totals)
|
||||||
|
|
||||||
dbg s = let p = "multiBalanceReport" in Hledger.Utils.dbg (p++" "++s) -- add prefix in this function's debug output
|
dbg1 s = let p = "multiBalanceReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in this function's debug output
|
||||||
-- dbg = const id -- exclude this function from debug output
|
-- dbg1 = const id -- exclude this function from debug output
|
||||||
|
|
||||||
|
|||||||
@ -54,7 +54,7 @@ postingsReport :: ReportOpts -> Query -> Journal -> PostingsReport
|
|||||||
postingsReport opts q j = (totallabel, items)
|
postingsReport opts q j = (totallabel, items)
|
||||||
where
|
where
|
||||||
-- figure out adjusted queries & spans like multiBalanceReport
|
-- figure out adjusted queries & spans like multiBalanceReport
|
||||||
symq = dbg "symq" $ filterQuery queryIsSym $ dbg "requested q" q
|
symq = dbg1 "symq" $ filterQuery queryIsSym $ dbg1 "requested q" q
|
||||||
depth = queryDepth q
|
depth = queryDepth q
|
||||||
depthless = filterQuery (not . queryIsDepth)
|
depthless = filterQuery (not . queryIsDepth)
|
||||||
datelessq = filterQuery (not . queryIsDateOrDate2) q
|
datelessq = filterQuery (not . queryIsDateOrDate2) q
|
||||||
@ -62,23 +62,23 @@ postingsReport opts q j = (totallabel, items)
|
|||||||
dateq = filterQuery queryIsDateOrDate2 q
|
dateq = filterQuery queryIsDateOrDate2 q
|
||||||
(dateqcons,pdate) | queryIsDate2 dateq || (queryIsDate dateq && date2_ opts) = (Date2, postingDate2)
|
(dateqcons,pdate) | queryIsDate2 dateq || (queryIsDate dateq && date2_ opts) = (Date2, postingDate2)
|
||||||
| otherwise = (Date, postingDate)
|
| otherwise = (Date, postingDate)
|
||||||
requestedspan = dbg "requestedspan" $ queryDateSpan' q -- span specified by -b/-e/-p options and query args
|
requestedspan = dbg1 "requestedspan" $ queryDateSpan' q -- span specified by -b/-e/-p options and query args
|
||||||
requestedspan' = dbg "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan ({-date2_ opts-} False) j -- if open-ended, close it using the journal's end dates
|
requestedspan' = dbg1 "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan ({-date2_ opts-} False) j -- if open-ended, close it using the journal's end dates
|
||||||
intervalspans = dbg "intervalspans" $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it
|
intervalspans = dbg1 "intervalspans" $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it
|
||||||
reportstart = dbg "reportstart" $ maybe Nothing spanStart $ headMay intervalspans
|
reportstart = dbg1 "reportstart" $ maybe Nothing spanStart $ headMay intervalspans
|
||||||
reportend = dbg "reportend" $ maybe Nothing spanEnd $ lastMay intervalspans
|
reportend = dbg1 "reportend" $ maybe Nothing spanEnd $ lastMay intervalspans
|
||||||
reportspan = dbg "reportspan" $ DateSpan reportstart reportend -- the requested span enlarged to a whole number of intervals
|
reportspan = dbg1 "reportspan" $ DateSpan reportstart reportend -- the requested span enlarged to a whole number of intervals
|
||||||
beforestartq = dbg "beforestartq" $ dateqcons $ DateSpan Nothing reportstart
|
beforestartq = dbg1 "beforestartq" $ dateqcons $ DateSpan Nothing reportstart
|
||||||
beforeendq = dbg "beforeendq" $ dateqcons $ DateSpan Nothing reportend
|
beforeendq = dbg1 "beforeendq" $ dateqcons $ DateSpan Nothing reportend
|
||||||
reportq = dbg "reportq" $ depthless $ And [datelessq, beforeendq] -- user's query with no start date, end date on an interval boundary and no depth limit
|
reportq = dbg1 "reportq" $ depthless $ And [datelessq, beforeendq] -- user's query with no start date, end date on an interval boundary and no depth limit
|
||||||
|
|
||||||
pstoend =
|
pstoend =
|
||||||
dbg "ps4" $ sortBy (comparing pdate) $ -- sort postings by date (or date2)
|
dbg1 "ps4" $ sortBy (comparing pdate) $ -- sort postings by date (or date2)
|
||||||
dbg "ps3" $ map (filterPostingAmount symq) $ -- remove amount parts which the query's cur: terms would exclude
|
dbg1 "ps3" $ map (filterPostingAmount symq) $ -- remove amount parts which the query's cur: terms would exclude
|
||||||
dbg "ps2" $ (if related_ opts then concatMap relatedPostings else id) $ -- with -r, replace each with its sibling postings
|
dbg1 "ps2" $ (if related_ opts then concatMap relatedPostings else id) $ -- with -r, replace each with its sibling postings
|
||||||
dbg "ps1" $ filter (reportq `matchesPosting`) $ -- filter postings by the query, including before the report start date, ignoring depth
|
dbg1 "ps1" $ filter (reportq `matchesPosting`) $ -- filter postings by the query, including before the report start date, ignoring depth
|
||||||
journalPostings $ journalSelectingAmountFromOpts opts j
|
journalPostings $ journalSelectingAmountFromOpts opts j
|
||||||
(precedingps, reportps) = dbg "precedingps, reportps" $ span (beforestartq `matchesPosting`) pstoend
|
(precedingps, reportps) = dbg1 "precedingps, reportps" $ span (beforestartq `matchesPosting`) pstoend
|
||||||
|
|
||||||
showempty = queryEmpty q || average_ opts
|
showempty = queryEmpty q || average_ opts
|
||||||
-- displayexpr = display_ opts -- XXX
|
-- displayexpr = display_ opts -- XXX
|
||||||
@ -87,14 +87,14 @@ postingsReport opts q j = (totallabel, items)
|
|||||||
whichdate = whichDateFromOpts opts
|
whichdate = whichDateFromOpts opts
|
||||||
itemps | interval == NoInterval = map (,Nothing) reportps
|
itemps | interval == NoInterval = map (,Nothing) reportps
|
||||||
| otherwise = summarisePostingsByInterval interval whichdate depth showempty reportspan reportps
|
| otherwise = summarisePostingsByInterval interval whichdate depth showempty reportspan reportps
|
||||||
items = dbg "items" $ postingsReportItems itemps (nullposting,Nothing) whichdate depth startbal runningcalc 1
|
items = dbg1 "items" $ postingsReportItems itemps (nullposting,Nothing) whichdate depth startbal runningcalc 1
|
||||||
where
|
where
|
||||||
startbal = if balancetype_ opts == HistoricalBalance then sumPostings precedingps else 0
|
startbal = if balancetype_ opts == HistoricalBalance then sumPostings precedingps else 0
|
||||||
runningcalc | average_ opts = \i avg amt -> avg + (amt - avg) `divideMixedAmount` (fromIntegral i) -- running average
|
runningcalc | average_ opts = \i avg amt -> avg + (amt - avg) `divideMixedAmount` (fromIntegral i) -- running average
|
||||||
| otherwise = \_ bal amt -> bal + amt -- running total
|
| otherwise = \_ bal amt -> bal + amt -- running total
|
||||||
|
|
||||||
dbg s = let p = "postingsReport" in Hledger.Utils.dbg (p++" "++s) -- add prefix in debug output
|
dbg1 s = let p = "postingsReport" in Hledger.Utils.dbg1 (p++" "++s) -- add prefix in debug output
|
||||||
-- dbg = const id -- exclude from debug output
|
-- dbg1 = const id -- exclude from debug output
|
||||||
|
|
||||||
totallabel = "Total"
|
totallabel = "Total"
|
||||||
|
|
||||||
|
|||||||
@ -86,65 +86,93 @@ debugLevel = case snd $ break (=="--debug") args of
|
|||||||
where
|
where
|
||||||
args = unsafePerformIO getArgs
|
args = unsafePerformIO getArgs
|
||||||
|
|
||||||
-- | Print a message and a showable value to the console if the global
|
-- | Convenience aliases for tracePrettyAt.
|
||||||
-- debug level is non-zero. Uses unsafePerformIO.
|
-- Pretty-print a message and the showable value to the console, then return it.
|
||||||
dbg :: Show a => String -> a -> a
|
dbg :: Show a => String -> a -> a
|
||||||
dbg = dbg1
|
dbg = tracePrettyAt 0
|
||||||
|
|
||||||
-- always prints
|
|
||||||
dbg0 :: Show a => String -> a -> a
|
|
||||||
dbg0 = dbgAt 0
|
|
||||||
|
|
||||||
|
-- | Pretty-print a message and the showable value to the console when the debug level is >= 1, then return it. Uses unsafePerformIO.
|
||||||
dbg1 :: Show a => String -> a -> a
|
dbg1 :: Show a => String -> a -> a
|
||||||
dbg1 = dbgAt 1
|
dbg1 = tracePrettyAt 1
|
||||||
|
|
||||||
dbg2 :: Show a => String -> a -> a
|
dbg2 :: Show a => String -> a -> a
|
||||||
dbg2 = dbgAt 2
|
dbg2 = tracePrettyAt 2
|
||||||
|
|
||||||
dbg3 :: Show a => String -> a -> a
|
dbg3 :: Show a => String -> a -> a
|
||||||
dbg3 = dbgAt 3
|
dbg3 = tracePrettyAt 3
|
||||||
|
|
||||||
dbg4 :: Show a => String -> a -> a
|
dbg4 :: Show a => String -> a -> a
|
||||||
dbg4 = dbgAt 4
|
dbg4 = tracePrettyAt 4
|
||||||
|
|
||||||
dbg5 :: Show a => String -> a -> a
|
dbg5 :: Show a => String -> a -> a
|
||||||
dbg5 = dbgAt 5
|
dbg5 = tracePrettyAt 5
|
||||||
|
|
||||||
dbg6 :: Show a => String -> a -> a
|
dbg6 :: Show a => String -> a -> a
|
||||||
dbg6 = dbgAt 6
|
dbg6 = tracePrettyAt 6
|
||||||
|
|
||||||
dbg7 :: Show a => String -> a -> a
|
dbg7 :: Show a => String -> a -> a
|
||||||
dbg7 = dbgAt 7
|
dbg7 = tracePrettyAt 7
|
||||||
|
|
||||||
dbg8 :: Show a => String -> a -> a
|
dbg8 :: Show a => String -> a -> a
|
||||||
dbg8 = dbgAt 8
|
dbg8 = tracePrettyAt 8
|
||||||
|
|
||||||
dbg9 :: Show a => String -> a -> a
|
dbg9 :: Show a => String -> a -> a
|
||||||
dbg9 = dbgAt 9
|
dbg9 = tracePrettyAt 9
|
||||||
|
|
||||||
-- | Print a message and a showable value to the console if the global
|
-- | Convenience aliases for tracePrettyAtIO.
|
||||||
-- debug level is at or above the specified level. Uses unsafePerformIO.
|
-- Like dbg, but convenient to insert in an IO monad.
|
||||||
dbgAt :: Show a => Int -> String -> a -> a
|
dbgIO :: Show a => String -> a -> IO ()
|
||||||
dbgAt lvl = dbgppshow lvl
|
dbgIO = tracePrettyAtIO 0
|
||||||
|
|
||||||
-- Could not deduce (a ~ ())
|
dbg1IO :: Show a => String -> a -> IO ()
|
||||||
-- from the context (Show a)
|
dbg1IO = tracePrettyAtIO 1
|
||||||
-- bound by the type signature for
|
|
||||||
-- dbgM :: Show a => String -> a -> IO ()
|
|
||||||
-- at hledger/Hledger/Cli/Main.hs:200:13-42
|
|
||||||
-- ‘a’ is a rigid type variable bound by
|
|
||||||
-- the type signature for dbgM :: Show a => String -> a -> IO ()
|
|
||||||
-- at hledger/Hledger/Cli/Main.hs:200:13
|
|
||||||
-- Expected type: String -> a -> IO ()
|
|
||||||
-- Actual type: String -> a -> IO a
|
|
||||||
-- dbgAtM :: (Monad m, Show a) => Int -> String -> a -> m a
|
|
||||||
-- dbgAtM lvl lbl x = dbgAt lvl lbl x `seq` return x
|
|
||||||
-- XXX temporary:
|
|
||||||
dbgAtM :: Show a => Int -> String -> a -> IO ()
|
|
||||||
dbgAtM = dbgAtIO
|
|
||||||
|
|
||||||
dbgAtIO :: Show a => Int -> String -> a -> IO ()
|
dbg2IO :: Show a => String -> a -> IO ()
|
||||||
dbgAtIO lvl lbl x = dbgAt lvl lbl x `seq` return ()
|
dbg2IO = tracePrettyAtIO 2
|
||||||
|
|
||||||
|
dbg3IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg3IO = tracePrettyAtIO 3
|
||||||
|
|
||||||
|
dbg4IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg4IO = tracePrettyAtIO 4
|
||||||
|
|
||||||
|
dbg5IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg5IO = tracePrettyAtIO 5
|
||||||
|
|
||||||
|
dbg6IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg6IO = tracePrettyAtIO 6
|
||||||
|
|
||||||
|
dbg7IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg7IO = tracePrettyAtIO 7
|
||||||
|
|
||||||
|
dbg8IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg8IO = tracePrettyAtIO 8
|
||||||
|
|
||||||
|
dbg9IO :: Show a => String -> a -> IO ()
|
||||||
|
dbg9IO = tracePrettyAtIO 9
|
||||||
|
|
||||||
|
-- | Pretty-print a message and a showable value to the console if the debug level is at or above the specified level.
|
||||||
|
-- dbtAt 0 always prints. Otherwise, uses unsafePerformIO.
|
||||||
|
tracePrettyAt :: Show a => Int -> String -> a -> a
|
||||||
|
tracePrettyAt lvl = dbgppshow lvl
|
||||||
|
|
||||||
|
tracePrettyAtIO :: Show a => Int -> String -> a -> IO ()
|
||||||
|
tracePrettyAtIO lvl lbl x = tracePrettyAt lvl lbl x `seq` return ()
|
||||||
|
|
||||||
|
-- XXX
|
||||||
|
-- Could not deduce (a ~ ())
|
||||||
|
-- from the context (Show a)
|
||||||
|
-- bound by the type signature for
|
||||||
|
-- dbgM :: Show a => String -> a -> IO ()
|
||||||
|
-- at hledger/Hledger/Cli/Main.hs:200:13-42
|
||||||
|
-- ‘a’ is a rigid type variable bound by
|
||||||
|
-- the type signature for dbgM :: Show a => String -> a -> IO ()
|
||||||
|
-- at hledger/Hledger/Cli/Main.hs:200:13
|
||||||
|
-- Expected type: String -> a -> IO ()
|
||||||
|
-- Actual type: String -> a -> IO a
|
||||||
|
--
|
||||||
|
-- tracePrettyAtM :: (Monad m, Show a) => Int -> String -> a -> m a
|
||||||
|
-- tracePrettyAtM lvl lbl x = tracePrettyAt lvl lbl x `seq` return x
|
||||||
|
|
||||||
-- | print this string to the console before evaluating the expression,
|
-- | print this string to the console before evaluating the expression,
|
||||||
-- if the global debug level is non-zero. Uses unsafePerformIO.
|
-- if the global debug level is non-zero. Uses unsafePerformIO.
|
||||||
@ -168,7 +196,7 @@ dbgshow level
|
|||||||
-- Values are displayed with ppShow, each field/constructor on its own line.
|
-- Values are displayed with ppShow, each field/constructor on its own line.
|
||||||
dbgppshow :: Show a => Int -> String -> a -> a
|
dbgppshow :: Show a => Int -> String -> a -> a
|
||||||
dbgppshow level
|
dbgppshow level
|
||||||
| debugLevel < level = flip const
|
| level > 0 && debugLevel < level = flip const
|
||||||
| otherwise = \s a -> let p = ppShow a
|
| otherwise = \s a -> let p = ppShow a
|
||||||
ls = lines p
|
ls = lines p
|
||||||
nlorspace | length ls > 1 = "\n"
|
nlorspace | length ls > 1 = "\n"
|
||||||
|
|||||||
@ -49,10 +49,10 @@ accounts :: CliOpts -> Journal -> IO ()
|
|||||||
accounts CliOpts{reportopts_=ropts} j = do
|
accounts CliOpts{reportopts_=ropts} j = do
|
||||||
d <- getCurrentDay
|
d <- getCurrentDay
|
||||||
let q = queryFromOpts d ropts
|
let q = queryFromOpts d ropts
|
||||||
nodepthq = dbg "nodepthq" $ filterQuery (not . queryIsDepth) q
|
nodepthq = dbg1 "nodepthq" $ filterQuery (not . queryIsDepth) q
|
||||||
depth = dbg "depth" $ queryDepth $ filterQuery queryIsDepth q
|
depth = dbg1 "depth" $ queryDepth $ filterQuery queryIsDepth q
|
||||||
ps = dbg "ps" $ journalPostings $ filterJournalPostings nodepthq j
|
ps = dbg1 "ps" $ journalPostings $ filterJournalPostings nodepthq j
|
||||||
as = dbg "as" $ nub $ filter (not . null) $ map (clipAccountName depth) $ sort $ map paccount ps
|
as = dbg1 "as" $ nub $ filter (not . null) $ map (clipAccountName depth) $ sort $ map paccount ps
|
||||||
as' | tree_ ropts = expandAccountNames as
|
as' | tree_ ropts = expandAccountNames as
|
||||||
| otherwise = as
|
| otherwise = as
|
||||||
render a | tree_ ropts = replicate (2 * (accountNameLevel a - 1)) ' ' ++ accountLeafName a
|
render a | tree_ ropts = replicate (2 * (accountNameLevel a - 1)) ' ' ++ accountLeafName a
|
||||||
|
|||||||
@ -241,11 +241,11 @@ accountWizard EntryState{..} = do
|
|||||||
line $ green $ printf "Account %d%s%s: " pnum (endmsg::String) (showDefault def)
|
line $ green $ printf "Account %d%s%s: " pnum (endmsg::String) (showDefault def)
|
||||||
where
|
where
|
||||||
canfinish = not (null esPostings) && postingsBalanced esPostings
|
canfinish = not (null esPostings) && postingsBalanced esPostings
|
||||||
parseAccountOrDotOrNull _ _ "." = dbg $ Just "." -- . always signals end of txn
|
parseAccountOrDotOrNull _ _ "." = dbg1 $ Just "." -- . always signals end of txn
|
||||||
parseAccountOrDotOrNull "" True "" = dbg $ Just "" -- when there's no default and txn is balanced, "" also signals end of txn
|
parseAccountOrDotOrNull "" True "" = dbg1 $ Just "" -- when there's no default and txn is balanced, "" also signals end of txn
|
||||||
parseAccountOrDotOrNull def@(_:_) _ "" = dbg $ Just def -- when there's a default, "" means use that
|
parseAccountOrDotOrNull def@(_:_) _ "" = dbg1 $ Just def -- when there's a default, "" means use that
|
||||||
parseAccountOrDotOrNull _ _ s = dbg $ either (const Nothing) validateAccount $ runParser (accountnamep <* eof) (jContext esJournal) "" s -- otherwise, try to parse the input as an accountname
|
parseAccountOrDotOrNull _ _ s = dbg1 $ either (const Nothing) validateAccount $ runParser (accountnamep <* eof) (jContext esJournal) "" s -- otherwise, try to parse the input as an accountname
|
||||||
dbg = id -- strace
|
dbg1 = id -- strace
|
||||||
validateAccount s | no_new_accounts_ esOpts && not (s `elem` journalAccountNames esJournal) = Nothing
|
validateAccount s | no_new_accounts_ esOpts && not (s `elem` journalAccountNames esJournal) = Nothing
|
||||||
| otherwise = Just s
|
| otherwise = Just s
|
||||||
|
|
||||||
|
|||||||
@ -434,7 +434,7 @@ periodBalanceReportAsText opts r@(MultiBalanceReport (colspans, items, (coltotal
|
|||||||
++ (if row_total_ opts then [" Total"] else [])
|
++ (if row_total_ opts then [" Total"] else [])
|
||||||
++ (if average_ opts then ["Average"] else [])
|
++ (if average_ opts then ["Average"] else [])
|
||||||
items' | empty_ opts = items
|
items' | empty_ opts = items
|
||||||
| otherwise = items -- dbg "2" $ filter (any (not . isZeroMixedAmount) . snd) $ dbg "1" items
|
| otherwise = items -- dbg1 "2" $ filter (any (not . isZeroMixedAmount) . snd) $ dbg1 "1" items
|
||||||
accts = map renderacct items'
|
accts = map renderacct items'
|
||||||
renderacct ((a,a',i),_,_,_)
|
renderacct ((a,a',i),_,_,_)
|
||||||
| tree_ opts = replicate ((i-1)*2) ' ' ++ a'
|
| tree_ opts = replicate ((i-1)*2) ' ' ++ a'
|
||||||
|
|||||||
@ -199,15 +199,15 @@ main = do
|
|||||||
isNullCommand = null rawcmd
|
isNullCommand = null rawcmd
|
||||||
(argsbeforecmd, argsaftercmd') = break (==rawcmd) args
|
(argsbeforecmd, argsaftercmd') = break (==rawcmd) args
|
||||||
argsaftercmd = drop 1 argsaftercmd'
|
argsaftercmd = drop 1 argsaftercmd'
|
||||||
dbgM :: Show a => String -> a -> IO ()
|
dbgIO :: Show a => String -> a -> IO ()
|
||||||
dbgM = dbgAtM 2
|
dbgIO = tracePrettyAtIO 2
|
||||||
|
|
||||||
dbgM "running" prognameandversion
|
dbgIO "running" prognameandversion
|
||||||
dbgM "raw args" args
|
dbgIO "raw args" args
|
||||||
dbgM "raw args rearranged for cmdargs" args'
|
dbgIO "raw args rearranged for cmdargs" args'
|
||||||
dbgM "raw command is probably" rawcmd
|
dbgIO "raw command is probably" rawcmd
|
||||||
dbgM "raw args before command" argsbeforecmd
|
dbgIO "raw args before command" argsbeforecmd
|
||||||
dbgM "raw args after command" argsaftercmd
|
dbgIO "raw args after command" argsaftercmd
|
||||||
|
|
||||||
-- Search PATH for add-ons, excluding any that match built-in names.
|
-- Search PATH for add-ons, excluding any that match built-in names.
|
||||||
-- The precise addon names (including file extension) are used for command
|
-- The precise addon names (including file extension) are used for command
|
||||||
@ -231,27 +231,27 @@ main = do
|
|||||||
generalHelp = putStr $ showModeHelp $ mainmode addonDisplayNames
|
generalHelp = putStr $ showModeHelp $ mainmode addonDisplayNames
|
||||||
badCommandError = error' ("command "++rawcmd++" is not recognized, run with no command to see a list") >> exitFailure
|
badCommandError = error' ("command "++rawcmd++" is not recognized, run with no command to see a list") >> exitFailure
|
||||||
f `orShowHelp` mode = if hasHelp args then putStr (showModeHelp mode) else f
|
f `orShowHelp` mode = if hasHelp args then putStr (showModeHelp mode) else f
|
||||||
dbgM "processed opts" opts
|
dbgIO "processed opts" opts
|
||||||
dbgM "command matched" cmd
|
dbgIO "command matched" cmd
|
||||||
dbgM "isNullCommand" isNullCommand
|
dbgIO "isNullCommand" isNullCommand
|
||||||
dbgM "isInternalCommand" isInternalCommand
|
dbgIO "isInternalCommand" isInternalCommand
|
||||||
dbgM "isExternalCommand" isExternalCommand
|
dbgIO "isExternalCommand" isExternalCommand
|
||||||
dbgM "isBadCommand" isBadCommand
|
dbgIO "isBadCommand" isBadCommand
|
||||||
d <- getCurrentDay
|
d <- getCurrentDay
|
||||||
dbgM "date span from opts" (dateSpanFromOpts d $ reportopts_ opts)
|
dbgIO "date span from opts" (dateSpanFromOpts d $ reportopts_ opts)
|
||||||
dbgM "interval from opts" (intervalFromOpts $ reportopts_ opts)
|
dbgIO "interval from opts" (intervalFromOpts $ reportopts_ opts)
|
||||||
dbgM "query from opts & args" (queryFromOpts d $ reportopts_ opts)
|
dbgIO "query from opts & args" (queryFromOpts d $ reportopts_ opts)
|
||||||
let
|
let
|
||||||
runHledgerCommand
|
runHledgerCommand
|
||||||
-- high priority flags and situations. --help should be highest priority.
|
-- high priority flags and situations. --help should be highest priority.
|
||||||
| hasHelp argsbeforecmd = dbgM "" "--help before command, showing general help" >> generalHelp
|
| hasHelp argsbeforecmd = dbgIO "" "--help before command, showing general help" >> generalHelp
|
||||||
| not (hasHelp argsaftercmd) && (hasVersion argsbeforecmd || (hasVersion argsaftercmd && isInternalCommand))
|
| not (hasHelp argsaftercmd) && (hasVersion argsbeforecmd || (hasVersion argsaftercmd && isInternalCommand))
|
||||||
= putStrLn prognameandversion
|
= putStrLn prognameandversion
|
||||||
| not (hasHelp argsaftercmd) && (hasDetailedVersion argsbeforecmd || (hasDetailedVersion argsaftercmd && isInternalCommand))
|
| not (hasHelp argsaftercmd) && (hasDetailedVersion argsbeforecmd || (hasDetailedVersion argsaftercmd && isInternalCommand))
|
||||||
= putStrLn prognameanddetailedversion
|
= putStrLn prognameanddetailedversion
|
||||||
-- \| (null externalcmd) && "binary-filename" `inRawOpts` rawopts = putStrLn $ binaryfilename progname
|
-- \| (null externalcmd) && "binary-filename" `inRawOpts` rawopts = putStrLn $ binaryfilename progname
|
||||||
-- \| "--browse-args" `elem` args = System.Console.CmdArgs.Helper.execute "cmdargs-browser" mainmode' args >>= (putStr . show)
|
-- \| "--browse-args" `elem` args = System.Console.CmdArgs.Helper.execute "cmdargs-browser" mainmode' args >>= (putStr . show)
|
||||||
| isNullCommand = dbgM "" "no command, showing general help" >> generalHelp
|
| isNullCommand = dbgIO "" "no command, showing general help" >> generalHelp
|
||||||
| isBadCommand = badCommandError
|
| isBadCommand = badCommandError
|
||||||
|
|
||||||
-- internal commands
|
-- internal commands
|
||||||
@ -271,9 +271,9 @@ main = do
|
|||||||
| isExternalCommand = do
|
| isExternalCommand = do
|
||||||
let externalargs = argsbeforecmd ++ filter (not.(=="--")) argsaftercmd
|
let externalargs = argsbeforecmd ++ filter (not.(=="--")) argsaftercmd
|
||||||
let shellcmd = printf "%s-%s %s" progname cmd (unwords' externalargs) :: String
|
let shellcmd = printf "%s-%s %s" progname cmd (unwords' externalargs) :: String
|
||||||
dbgM "external command selected" cmd
|
dbgIO "external command selected" cmd
|
||||||
dbgM "external command arguments" (map quoteIfNeeded externalargs)
|
dbgIO "external command arguments" (map quoteIfNeeded externalargs)
|
||||||
dbgM "running shell command" shellcmd
|
dbgIO "running shell command" shellcmd
|
||||||
system shellcmd >>= exitWith
|
system shellcmd >>= exitWith
|
||||||
|
|
||||||
-- deprecated commands
|
-- deprecated commands
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user