mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-07-07 20:06:39 +02:00
CmdConfig: Implemented setConfigVariable
This commit is contained in:
parent
fdabe88c78
commit
d56028f9ca
1 changed files with 88 additions and 2 deletions
|
@ -25,10 +25,12 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include <cmake.h>
|
#include <cmake.h>
|
||||||
|
#include <FS.h>
|
||||||
|
#include <JSON2.h>
|
||||||
#include <shared.h>
|
#include <shared.h>
|
||||||
#include <format.h>
|
#include <format.h>
|
||||||
|
#include <unicode.h>
|
||||||
#include <timew.h>
|
#include <timew.h>
|
||||||
#include <stack>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
@ -38,9 +40,93 @@
|
||||||
// an override any setting which resides in an imported file.
|
// an override any setting which resides in an imported file.
|
||||||
static bool setConfigVariable (const Rules& rules, std::string name, std::string value, bool confirmation /* = false */)
|
static bool setConfigVariable (const Rules& rules, std::string name, std::string value, bool confirmation /* = false */)
|
||||||
{
|
{
|
||||||
|
// Read config file as lines of text.
|
||||||
|
std::vector <std::string> lines;
|
||||||
|
File::read (rules.file (), lines);
|
||||||
|
|
||||||
bool change = false;
|
bool change = false;
|
||||||
|
|
||||||
return change;
|
if (rules.has (name))
|
||||||
|
{
|
||||||
|
// No change.
|
||||||
|
if (rules.get (name) == value)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// If there is a non-comment line containing the entry in flattened form:
|
||||||
|
// a.b.c = value
|
||||||
|
bool found = false;
|
||||||
|
for (auto& line : lines)
|
||||||
|
{
|
||||||
|
auto comment = line.find ('#');
|
||||||
|
auto pos = line.find (name);
|
||||||
|
if (pos != std::string::npos &&
|
||||||
|
(comment == std::string::npos || comment > pos))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
|
||||||
|
// Modify value
|
||||||
|
if (! confirmation ||
|
||||||
|
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?",
|
||||||
|
name,
|
||||||
|
rules.get (name),
|
||||||
|
value)))
|
||||||
|
{
|
||||||
|
line = line.substr (0, pos) + name + " = " + value;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it was not found, then retry in hierarchical form∴
|
||||||
|
// a:
|
||||||
|
// b:
|
||||||
|
// c = value
|
||||||
|
if (! found)
|
||||||
|
{
|
||||||
|
auto leaf = split (name, '.').back () + ":";
|
||||||
|
for (auto& line : lines)
|
||||||
|
{
|
||||||
|
auto comment = line.find ('#');
|
||||||
|
auto pos = line.find (leaf);
|
||||||
|
if (pos != std::string::npos &&
|
||||||
|
(comment == std::string::npos || comment > pos))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
|
||||||
|
// Remove name
|
||||||
|
if (! confirmation ||
|
||||||
|
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?",
|
||||||
|
name,
|
||||||
|
rules.get (name),
|
||||||
|
value)))
|
||||||
|
{
|
||||||
|
line = line.substr (0, pos) + leaf + " " + value;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! confirmation ||
|
||||||
|
confirm (format ("Are you sure you want to add '{1}' with a value of '{2}'?", name, value)))
|
||||||
|
{
|
||||||
|
// TODO Ideally, this would locate an existing hierarchy and insert the
|
||||||
|
// new leaf/value properly. But that's non-trivial.
|
||||||
|
|
||||||
|
// Add blank line required by rules.
|
||||||
|
if (lines.back () != "")
|
||||||
|
lines.push_back ("");
|
||||||
|
|
||||||
|
// Add new line.
|
||||||
|
lines.push_back (name + " = " + JSON2::encode (value));
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (change)
|
||||||
|
File::write (rules.file (), lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue