getpkg/dropshell-tool/src/BashrcEditor.cpp
2025-05-28 19:14:31 +12:00

134 lines
3.8 KiB
C++

#include "BashrcEditor.hpp"
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
#include <filesystem>
#include <iostream>
#include "DropshellScriptManager.hpp"
namespace dropshelltool
{
const std::filesystem::path DROPSHELL_RC_PATH = std::filesystem::path(std::getenv("HOME")) / ".bashrc_dropshell_tool";
static const std::filesystem::path BASHRC_PATH = std::filesystem::path(std::getenv("HOME")) / ".bashrc";
std::string removeWhitespace(const std::string &s)
{
std::string out;
for (char c : s)
{
if (!isspace(static_cast<unsigned char>(c)))
out += c;
}
return out;
}
static constexpr const char *BLOCK_START = "#---DROPSHELL-TOOL-START---";
static constexpr const char *BLOCK_END = "#---DROPSHELL-TOOL-END---";
BashrcEditor::BashrcEditor()
{
}
bool BashrcEditor::hasSourceLine() const
{
std::ifstream infile(BASHRC_PATH);
if (!infile)
return false;
std::string line;
bool inBlock = false;
const std::string blockStart = removeWhitespace(BLOCK_START);
const std::string blockEnd = removeWhitespace(BLOCK_END);
const std::string target = "source \"" + DROPSHELL_RC_PATH.string() + "\"";
while (std::getline(infile, line))
{
std::string trimmed = removeWhitespace(line);
if (trimmed == blockStart)
{
return true;
}
}
return false;
}
void BashrcEditor::addSourceLine()
{
std::ifstream infile(BASHRC_PATH);
std::vector<std::string> lines;
std::string line;
bool inBlock = false;
const std::string blockStart = removeWhitespace(BLOCK_START);
const std::string blockEnd = removeWhitespace(BLOCK_END);
while (std::getline(infile, line))
{
std::string trimmed = removeWhitespace(line);
if (trimmed == blockStart)
{
inBlock = true;
continue;
}
if (trimmed == blockEnd)
{
inBlock = false;
continue;
}
if (!inBlock)
{
lines.push_back(line);
}
}
infile.close();
lines.push_back(BLOCK_START);
lines.push_back("source \"" + DROPSHELL_RC_PATH.string() + "\"");
lines.push_back(BLOCK_END);
std::ofstream outfile(BASHRC_PATH, std::ios::trunc);
for (const auto &l : lines)
{
outfile << l << "\n";
}
outfile.close();
if (!std::filesystem::exists(DROPSHELL_RC_PATH))
{
DropshellScriptManager scriptManager;
scriptManager.ensureExists();
}
}
void BashrcEditor::removeSourceLine()
{
std::ifstream infile(BASHRC_PATH);
std::vector<std::string> lines;
std::string line;
bool inBlock = false;
const std::string blockStart = removeWhitespace(BLOCK_START);
const std::string blockEnd = removeWhitespace(BLOCK_END);
while (std::getline(infile, line))
{
std::string trimmed = removeWhitespace(line);
if (trimmed == blockStart)
{
inBlock = true;
continue;
}
if (trimmed == blockEnd)
{
inBlock = false;
continue;
}
if (!inBlock)
{
lines.push_back(line);
}
}
infile.close();
std::ofstream outfile(BASHRC_PATH, std::ios::trunc);
for (const auto &l : lines)
{
outfile << l << "\n";
}
}
}