Как сопоставить константы с пользовательскими строками - PullRequest
2 голосов
/ 02 июня 2019

Я использую ящик git2 , чтобы получить список статусов в хранилище git, это код, который я использую:

use git2::{Repository, StatusOptions, StatusShow};
use std::{collections::HashMap, env};

fn main() {
    let path = env::current_dir().unwrap();
    let repo = Repository::discover(path).unwrap();
    let mut status_opt = StatusOptions::new();
    status_opt
        .show(StatusShow::IndexAndWorkdir)
        .include_untracked(true)
        .include_unmodified(false)
        .no_refresh(false);
    let status_result = repo.statuses(Some(&mut status_opt)).unwrap();

    let mut map: HashMap<git2::Status, u32> = HashMap::new();

    for status_entry in status_result.iter() {
        *map.entry(status_entry.status()).or_insert(0) += 1;
    }
    println!("{:?}", map);
}

На основепо модификациям текущего репозитория возвращает карту git2::Status и вхождений, но я бы хотел вернуть аналогичный вывод в команду git status --porcelain.

Например, в зависимости отизменения хранилища, это вывод git status --porcelain:

M  file_a
AM file_b
A  file_c
?? file_e
?? file_f

Передача вывода в awk:

$ git status --porcelain | awk -v ORS=", " 'NR>0{arr[$1]++}END{for (a in arr) print a, arr[a]}'
A 1, ?? 2, M 1, AM 1,

Использование Rust приведенный выше код вернет:

{INDEX_NEW: 1, WT_NEW: 2, INDEX_NEW | WT_MODIFIED: 1, INDEX_MODIFIED: 1}

Я хотел бы знать, как можно сопоставить значение git2::Status констант с пользовательскими строками (совпадающими со строками фарфора), например:

INDEX_NEW                -> A 
INDEX_NEW | WT_MODIFIED  -> AM
INDEX_MODIFIED           -> M
WT_NEW                   -> ??

Главным образом, как поступать с такими делами, как INDEX_NEW | WT_MODIFIED, которые будут отображаться, например, в AM

1 Ответ

4 голосов
/ 02 июня 2019

Следующий фрагмент кода берет ваш map и превращает его в желаемое представление. Приведенный пример собирает значения в другой HashMap, и у него есть рука, которая паникует, но не стесняйтесь конвертировать значения git2::Status на лету (т.е. при первой итерации по ним).

let mut output = HashMap::new();
for (key, value) in map.iter()
{
    let key = match key
    {

        s if s.contains(git2::Status::INDEX_NEW) &&
             s.contains(git2::Status::WT_MODIFIED) => "AM",
        s if s.contains(git2::Status::INDEX_NEW) => "A",
        s if s.contains(git2::Status::INDEX_MODIFIED) => "M",
        _ => panic!("Unexpected status"),
    };

    output.insert(key, value);
}

println!("{:?}", output);

Если вы посмотрите на примеры выбранной вами библиотеки, вы найдете нечто очень похожее: git2-rs/examples/status.rs

Для получения дополнительной информации о синтаксисе сопоставления с образцом, обратитесь к The Rust Programming Book .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...