dotfile リポジトリ マネージャーを作成していますが、リポジトリを削除するコマンドが機能しません。リポジトリ フォルダーに移動し、すべてのファイルとディレクトリを一覧表示して、それらを削除できるようにする必要があります。.git
問題は、削除する必要があるすべてのファイルまたはディレクトリをリストしますが、空ではない を除外することです。他のリポジトリでさらにテストを行った結果、名前がドットで始まる空でないディレクトリはすべて無視され、「通常の」ドットファイルは問題ないという結論が得られました。問題のあるコードは次のとおりです。簡単に説明します。
rm_dotfiles_repository がリポジトリの名前で呼び出され、リポジトリに到達してrepo_dir(repo)
からreaddir
ループが開始されます。フォルダーを再帰的に削除する必要があるため、フォルダーと単純な古いファイルの間でフィルター処理を行います。.
フォルダーと を除外していないことに注意してください。ただし..
、すぐに追加します。
#define _XOPEN_SOURCE 500
#include "repository.h"
#include "helpers.h"
#include "nftwcallbacks.h"
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <error.h>
void rm_dotfiles_repository(char* repo)
{
repo_dir(repo);
/* Remove the repository's files recursively
* TODO: Remove the symbolic links in ~ before removing the repo
* We remove the repository, target by target */
DIR* dir = NULL;
struct dirent* file = NULL;
struct stat stat_data;
dir = opendir(".");
if (dir == NULL)
{
perror("Error:");
exit(EXIT_FAILURE);
}
file = readdir(dir);
while ((file = readdir(dir)) != NULL)
{
if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
{
/* TODO: why isn't .git listed, even if .gitmodules is listed ? After tests, it seems that .something repositories which are non-empty
* aren't listed*/
if(stat(file->d_name, &stat_data))
{
perror("Error");
exit(EXIT_FAILURE);
}
if (S_ISDIR(stat_data.st_mode))
{
remove_target(repo, file->d_name);
}
else
{
printf("Remove file %s\n", file->d_name);
}
}
}
if (closedir(dir))
{
perror("Error:");
exit(EXIT_FAILURE);
}
}
void install_target(char* repo, char* target)
{
repo_dir(repo);
if (nftw(target, install, 4, 0))
{
exit(EXIT_FAILURE);
}
}
void remove_target(char* repo, char* target)
{
printf("Remove target %s from repo %s\n", target, repo);
}
問題の原因を見つけるのを手伝ってくれませんか? 前もって感謝します
EDIT:Mats Peterssonが尋ねたように、ここに完全なコードがあります.私が与えたスニペットはrepository.cです