Приложения Grails и управление версиями

Это можно сделать полностью внутри bash. Хотя манипулирование строками в цикле в bash является медленным, существует простой алгоритм, логарифмирующий по числу операций оболочки, поэтому чистый bash является жизнеспособным вариантом даже для длинных строк.

longest_common_prefix () {
  local prefix= n
  ## Truncate the two strings to the minimum of their lengths
  if [[ ${#1} -gt ${#2} ]]; then
    set -- "${1:0:${#2}}" "$2"
  else
    set -- "$1" "${2:0:${#1}}"
  fi
  ## Binary search for the first differing character, accumulating the common prefix
  while [[ ${#1} -gt 1 ]]; do
    n=$(((${#1}+1)/2))
    if [[ ${1:0:$n} == ${2:0:$n} ]]; then
      prefix=$prefix${1:0:$n}
      set -- "${1:$n}" "${2:$n}"
    else
      set -- "${1:0:$n}" "${2:0:$n}"
    fi
  done
  ## Add the one remaining character, if common
  if [[ $1 = $2 ]]; then prefix=$prefix$1; fi
  printf %s "$prefix"
}

Стандартный набор инструментов включает в себя cmp для сравнения двоичных файлов. По умолчанию, это указывает смещение байта первых отличающихся байтов. Существует особый случай, когда одна строка является префиксом другой: cmp создает другое сообщение в STDERR; Самый простой способ справиться с этим - взять самую короткую строку.

longest_common_prefix () {
  local LC_ALL=C offset prefix
  offset=$(export LC_ALL; cmp <(printf %s "$1") <(printf %s "$2") 2>/dev/null)
  if [[ -n $offset ]]; then
    offset=${offset%,*}; offset=${offset##* }
    prefix=${1:0:$((offset-1))}
  else
    if [[ ${#1} -lt ${#2} ]]; then
      prefix=$1
    else
      prefix=$2
    fi
  fi
  printf %s "$prefix"
}

Обратите внимание, что cmp работает с байтами, но манипулирование строками в bash работает с символами. Это имеет значение для многобайтовых локалей, например, для локалей, использующих набор символов UTF-8. Функция выше печатает самый длинный префикс байтовой строки. Чтобы обработать строки символов с помощью этого метода, мы можем сначала преобразовать строки в кодировку с фиксированной шириной. Предполагая, что набор символов локали является подмножеством Unicode, UTF-32 отвечает всем требованиям.

longest_common_prefix () {
  local offset prefix LC_CTYPE="${LC_ALL:=LC_CTYPE}"
  offset=$(unset LC_ALL; LC_MESSAGES=C cmp <(printf %s "$1" | iconv -t UTF-32)
                                           <(printf %s "$2" | iconv -t UTF-32) 2>/dev/null)
  if [[ -n $offset ]]; then
    offset=${offset%,*}; offset=${offset##* }
    prefix=${1:0:$((offset/4-1))}
  else
    if [[ ${#1} -lt ${#2} ]]; then
      prefix=$1
    else
      prefix=$2
    fi
  fi
  printf %s "$prefix"
}

7
задан Jamey 5 June 2009 в 15:20
поделиться

3 ответа

вот мой .gitignore (вероятно, он содержит много мусора)

.idea/
stacktrace.log
test/reports/
etc/errors.txt
bin-groovy/
.classpath
.project
*.war
web-app/plugins/
web-app/resources/
classes/
test/reports/

Обратите внимание, что это для grails 1.1.1. (Я думаю, что до Grails 1.1 плагины хранились в / plugins вместо web-app / plugins .

6
ответ дан 6 December 2019 в 23:12
поделиться

На Grails.org есть специальные инструкции по проверке вашего проекта в SVN.

5
ответ дан 6 December 2019 в 23:12
поделиться

Вы должны исключить каталог "test / reports" из вашей корневой папки. Также полезно исключить "stacktrace.log".

Если вы используете JS-библиотеки, вы можете подумать об их исключении и написать небольшой скрипт, чтобы всегда получать последнюю версию исправления ошибок. Современные JS-библиотеки могут быть очень большими, и не очень полезно загромождать VCS старыми версиями ваших фреймворков. Исключением является переход к новой основной версии библиотеки или тега. В этом случае обязательно сохраните старую версию.

0
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

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