Что делает git_sysdir_find_in_dirlist () в libgit2? - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над переносом некоторой логики из libgit2 в Go, но не через порт 1: 1, так как Go работает по-другому.Я думаю, что эта функция сканирует дерево каталогов, но я не уверен.

static int git_sysdir_find_in_dirlist(
    git_buf *path,
    const char *name,
    git_sysdir_t which,
    const char *label)
{
    // allocations
    size_t len;
    const char *scan, *next = NULL;
    const git_buf *syspath;

    // check the path to make sure it exists?
    GIT_ERROR_CHECK_ERROR(git_sysdir_get(&syspath, which));
    if (!syspath || !git_buf_len(syspath))
        goto done;

    // this is the part I don't understand
    for (scan = git_buf_cstr(syspath); scan; scan = next) {
        /* find unescaped separator or end of string */
        for (next = scan; *next; ++next) {
            if (*next == GIT_PATH_LIST_SEPARATOR &&
                (next <= scan || next[-1] != '\\'))
                break;
        }

        len = (size_t)(next - scan);
        next = (*next ? next + 1 : NULL);
        if (!len)
            continue;

        GIT_ERROR_CHECK_ERROR(git_buf_set(path, scan, len));
        if (name)
            GIT_ERROR_CHECK_ERROR(git_buf_joinpath(path, path->ptr, name));

        if (git_path_exists(path->ptr))
            return 0;
    }

done:
    git_buf_dispose(path);
    git_error_set(GIT_ERROR_OS, "the %s file '%s' doesn't exist", label, name);
    return GIT_ENOTFOUND;
}

Меня смущает цикл for.for (scan = git_buf_cstr(syspath); scan; scan = next) { ... } выглядит так, как будто он выполняет итерацию / сканирование syspath, и тогда я полностью теряюсь при for (scan = git_buf_cstr(syspath); scan; scan = next) { ... }.

Что конкретно делает эта функция?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Эта функция выполняет поиск файла name внутри «уровня конфигурации» (т. Е. ~/.git/, /etc/git, список известных местоположений см. В git_sysdir_t ). Поскольку эти уровни хранятся в виде набора статических («только для чтения») / (или \) разделенных строк C, и мы не можем изменить это во время выполнения, мы должны перепрыгнуть через обручи к тому, что составляет цикл foreach-string.

0 голосов
/ 03 апреля 2019

Это не смотрит на каталог дерево , а скорее на строку с разделителями, содержащую список каталогов . Например (хотя это явно не нацелено на данный конкретный случай), как документация верхнего уровня гласит:

GIT_ALTERNATE_OBJECT_DIRECTORIES
Из-за неизменности объектов Git старые объекты могут быть архивируются в общие, доступные только для чтения каталоги. Эта переменная Определяет разделенный ":" (в Windows ";" разделенный) список Git каталоги объектов, которые можно использовать для поиска объектов Git. новый объекты не будут записаны в эти каталоги.

Записи, начинающиеся с "(двойная кавычка), будут интерпретироваться как Кавычки в стиле C, убирающие ведущие и конечные двойные кавычки и уважение убегает. Например, стоимость "путь-с-\" - и -: -in-it: vanilla-путь имеет два пути: путь-с - "- и -: - в нем и ванильный путь .

Функция, очевидно, сканирует список путей, разделенных символами (независимо от того, что это за символ - вероятно, двоеточие или точка с запятой, как указано выше), проверяя префиксы обратной косой черты, так что вы можете написать /a:C\:/a, чтобы позволить элементу заглянуть либо в /a или C:/a.

...