[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/QuantStack/git2cpp/0.0.12/src/subcommand/rm_subcommand.cpp [Back]  [Original]

#include "rm_subcommand.hpp"

#include 
#include 

#include "../utils/common.hpp"
#include "../utils/git_exception.hpp"
#include "../wrapper/index_wrapper.hpp"
#include "../wrapper/repository_wrapper.hpp"

namespace fs = std::filesystem;

rm_subcommand::rm_subcommand(const libgit2_object&, CLI::App& app)
{
    auto* rm = app.add_subcommand("rm", "Remove files from the working tree and from the index");
    rm->add_option("", m_pathspec, "Files to remove");
    rm->add_flag("-r", m_recursive, "Allow recursive removal when a leading directory name is given");

    rm->callback(
        [this]()
        {
            this->run();
        }
    );
}

void rm_subcommand::run()
{
    auto directory = get_current_git_path();
    auto repo = repository_wrapper::open(directory);

    index_wrapper index = repo.make_index();

    std::vector files;
    std::vector directories;

    std::ranges::for_each(
        m_pathspec,
        [&](const std::string& path)
        {
            if (!fs::exists(path))
            {
                std::string msg = "fatal: pathspec '" + path + "' did not math any file";
                throw git_exception(msg, git2cpp_error_code::FILESYSTEM_ERROR);
            }
            if (fs::is_directory(path))
            {
                directories.push_back(path);
            }
            else
            {
                if (!repo.does_track(path))
                {
                    std::string msg = "fatal: pathsspec '" + path + "'is not tracked";
                    throw git_exception(msg, git2cpp_error_code::FILESYSTEM_ERROR);
                }
                files.push_back(path);
            }
        }
    );

    if (!directories.empty() && !m_recursive)
    {
        std::string msg = "fatal: not removing '" + directories.front() + "' recursively without -r";
        throw git_exception(msg, git2cpp_error_code::FILESYSTEM_ERROR);
    }

    index.remove_entries(files);
    index.remove_directories(directories);
    index.write();

    std::ranges::for_each(
        files,
        [](const std::string& path)
        {
            fs::remove(path);
        }
    );
    std::ranges::for_each(
        directories,
        [](const std::string& path)
        {
            fs::remove_all(path);
        }
    );
}

Web Proxy Viewer  |  New URL  |  Original Page