покажите ограниченное состояние разности мерзавца в ls, только в каталогах мерзавца

Это могло бы быть нечетной проблемой, но я хотел бы переопределить поведение ls когда в каталоге мерзавца.

Я хочу извлечь некоторую различную статистику из последней фиксации и добавить ее к нижней части ls. Когда в корне проекта мерзавца, я хочу сделать определенную подсказку как это:

app/
test/
.gitignore
test.py
run.py
README.md

+ 11 lines
- 3 lines
Last commit: "add a new test for deployment" (Oct 14, 2014)

Когда глубже, чем корень, я захочу создать подсказку как это (скажите меня cd'd test/ и затем используйте ls команда):

test/
├── __init__.py
├── test_deploy.py
└── test_add_user.py (+3 lines since last commit)

Бонусные очки: цветной зеленый/красный для плюс/минус строки и хорошее универсальное переключение вкладок на информации о мерзавце.

Как это может быть достигнуто?

1
задан 10 November 2014 в 23:06

1 ответ

Во-первых, для создания пользовательского ls, самый легкий путь состоит в том, чтобы продолжиться следующим образом:

  1. Создайте каталог $HOME/bin
  2. Добавить $HOME/bin к Вашему PATH. Чтобы сделать это, откройте файл ~/.bashrc в Вашем любимом текстовом редакторе, и добавляют следующую строку в конец:

    export PATH=$HOME/bin:$PATH
    

    Обратите внимание, что важно, чтобы Вы предварительно ожидали $HOME/bin к Вашему PATH, так, чтобы исполняемые файлы там имели приоритет по другим исполняемым файлам с тем же именем вдоль Вашего PATH (такой как, в Вашем случае, ls команда)

  3. Создайте файл $HOME/bin/ls с содержанием, которое я отправлю ниже.
  4. Сделайте это исполняемым файлом: chmod 755 $HOME/bin/ls.
  5. Необходимо будет, вероятно, перезапустить терминал.

Во-вторых, Ваше новое $HOME/bin/ls должен вести себя как так: Это проверяет, является ли текущий каталог репозиторием мерзавца, и

  • если не, это просто делегирует к нормальному /bin/ls исполняемый файл.
  • если да, это создает тот вывод, Вы попросили, в зависимости от того, является ли текущая папка корнем репозитория мерзавца или если это глубже.

Я быстро взломал такой сценарий вместе для Вас. Это ни в коем случае не прекрасно, но это должно быть достаточно близко к тому, что Вы хотите, и можно легко проложить себе путь оттуда.:-)

#!/bin/bash

# determine if we're in a git repo, what the root dir is, and assign it to GIT_ROOT, all in one swoop
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)

# if not in git repo, relay to normal ls
if (( $? )); then
  /bin/ls "$@"

# if in git repo, are we in root dir?
elif [ "x$GIT_ROOT" = "x$PWD" ]; then
  # first, normal ls with 1 file per line, also pass along other parameters
  /bin/ls -1 "$@"
  echo
  # a few git stats
  GIT_DIFF=$(git diff --stat | tail -1)
  # any insertions?
  echo $GIT_DIFF | grep insertion >/dev/null
  if (( ! $? )); then
    # bonus points: color in green
    echo -e "\e[0;32m+ $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) insertion.*/\1/;') lines\e[0m"
  fi
  # any deletions?
  echo $GIT_DIFF | grep deletion >/dev/null
  if (( ! $? )); then
    # bonus points: color in red
    echo -e "\e[0;31m- $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) deletion.*/\1/;') lines\e[0m"
  fi
  # Finally, display last commit message and date
  git log -1 --pretty='Last commit: "%s" (%ad)'

# otherwise, we're depper in a git repo
else
  echo -e "\e[1;34m${PWD##*/}\e[0m"
  IFS=$'\n'
  for file in $(tree -C | tail -n +2 | head -n -2); do
    filename=$(echo $file | cut -d" " -f 2-)
    echo -n $file
    # a few git stats
    GIT_DIFF=$(git diff --stat "$(echo $filename | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")")
    # any insertions?
    echo $GIT_DIFF | grep insertion >/dev/null
    if (( ! $? )); then
      # bonus points: color in green
      echo -ne " \e[0;32m(+ $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) insertion.*/\1/;') lines since last commit)\e[0m"
    fi
    # any deletions?
    echo $GIT_DIFF | grep deletion >/dev/null
    if (( ! $? )); then
      # bonus points: color in red
      echo -ne " \e[0;31m(- $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) deletion.*/\1/;') lines since last commit)\e[0m"
    fi
    echo
  done

fi

Демонстрация

Примечание: вывод приятно окрашен, хотя ясно это не покажет здесь.

$ ls
app
README.md
run.py
test
test.py

+ 11 lines
- 3 lines
Last commit: "add a new test for deployment" (Fri Nov 21 04:20:37 2014 +0100)
$ cd test/
$ ls
test
├── bla
├── __init__.py
├── test_add_user.py (+ 3 lines since last commit)
└── test_deploy.py
1
ответ дан 11 November 2019 в 12:31

Другие вопросы по тегам:

Похожие вопросы: