mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-07-07 20:06:39 +02:00
validate: Prevents overlapping intervals
This commit is contained in:
parent
93aff67ee0
commit
0c05fa5a50
1 changed files with 48 additions and 6 deletions
|
@ -89,14 +89,55 @@ static void autoAdjust (
|
||||||
const CLI& cli,
|
const CLI& cli,
|
||||||
const Rules& rules,
|
const Rules& rules,
|
||||||
Database& database,
|
Database& database,
|
||||||
const Interval& filter,
|
|
||||||
Interval& interval)
|
Interval& interval)
|
||||||
{
|
{
|
||||||
if (findHint (cli, ":adjust"))
|
// Without :adjust, overlapping intervals are an error condition.
|
||||||
|
auto adjust = findHint (cli, ":adjust");
|
||||||
|
|
||||||
|
// An empty filter allows scanning beyond interval.range.
|
||||||
|
Interval range_filter;
|
||||||
|
auto tracked = getTracked (database, rules, range_filter);
|
||||||
|
|
||||||
|
for (auto& track : tracked)
|
||||||
{
|
{
|
||||||
// An empty filter allows scanning beyond interval.range.
|
if (interval.range.overlap (track.range))
|
||||||
Interval range_filter;
|
{
|
||||||
auto tracked = getTracked (database, rules, range_filter);
|
if (! adjust)
|
||||||
|
throw std::string ("You cannot overlap intervals. Adjust the start/end "
|
||||||
|
"time, or specify the :adjust hint.");
|
||||||
|
|
||||||
|
std::cout << "# Overlap new " << interval.dump () << "\n"
|
||||||
|
<< "# existing " << track.dump () << "\n";
|
||||||
|
|
||||||
|
if (interval.range.start <= track.range.start)
|
||||||
|
{
|
||||||
|
// interval [--------)
|
||||||
|
// C [----)
|
||||||
|
//
|
||||||
|
// adjusted (dominate) C deleted
|
||||||
|
// adjusted (defer) interval split, C unmodified
|
||||||
|
|
||||||
|
// interval [--------)
|
||||||
|
// D [--------)
|
||||||
|
//
|
||||||
|
// adjusted (dominate) D modified
|
||||||
|
// adjusted (defer) interval modified
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// interval [--------)
|
||||||
|
// B [--------)
|
||||||
|
//
|
||||||
|
// adjusted (dominate) B modified
|
||||||
|
// adjusted (defer) interval modified
|
||||||
|
|
||||||
|
// interval [--------)
|
||||||
|
// F [-------------)
|
||||||
|
//
|
||||||
|
// adjusted (dominate) F split
|
||||||
|
// adjusted (defer) interval deleted
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,8 +181,9 @@ void validate (
|
||||||
if (! filter.range.is_started ())
|
if (! filter.range.is_started ())
|
||||||
filter.range = Range (Datetime ("today"), Datetime ("tomorrow"));
|
filter.range = Range (Datetime ("today"), Datetime ("tomorrow"));
|
||||||
|
|
||||||
|
// All validation performed here.
|
||||||
autoFill (cli, rules, database, filter, interval);
|
autoFill (cli, rules, database, filter, interval);
|
||||||
autoAdjust (cli, rules, database, filter, interval);
|
autoAdjust (cli, rules, database, interval);
|
||||||
warnOnNewTag (rules, database, interval);
|
warnOnNewTag (rules, database, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue