Можно выполнить метод объекта на любом объекте, независимо от того, имеет ли он тот метод или нет. Конечно, это не могло бы всегда работать (если метод предполагает, что объект имеет что-то, что это не делает), но это может быть чрезвычайно полезно. Например:
function(){
arguments.push('foo') // This errors, arguments is not a proper array and has no push method
Array.prototype.push.apply(arguments, ['foo']) // Works!
}
В Subversion есть команда для выполнения именно этого: SVNVERSION.EXE .
использование: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]
Создание компактный 'номер версии' для пути к рабочей копии WC_PATH. TRAIL_URL - завершающая часть URL-адреса, используемого для определить, переключается ли сам WC_PATH (обнаружение переключателей внутри WC_PATH не полагается на TRAIL_URL). Номер версии выводится на стандартный вывод. Например:
$ svnversion . /repos/svn/trunk
4168
Номер версии будет одним числом, если рабочий копия - единственная ревизия, немодифицированная, неизмененная и с URL-адрес, соответствующий аргументу TRAIL_URL. Если рабочий копия необычная, номер версии будет более сложным:
4123: 4168 рабочая копия смешанной редакции
4168M модифицированная рабочая копия
4123S переключенная рабочая копия
4123: 4168MS смешанная ревизия, измененная, переключенная рабочая копия
При вызове каталога, который не является рабочей копией, экспортированный каталог скажем, программа выведет "экспортировано".
Если вызвать без аргументов, WC_PATH будет текущим каталогом.
Допустимые параметры: -n [--no-newline]: не выводить завершающую новую строку -c [--committed]: последние изменения, а не текущие версии -h [--help]: показать эту справку --version: показать информацию о версии
Я использую следующий фрагмент сценария оболочки для создания файла заголовка svnversion.h
, который определяет несколько постоянных символьных строк, которые я использую в скомпилированном коде. У вас должно получиться нечто очень похожее:
#!/bin/sh -e
svnversion() {
svnrevision=`LC_ALL=C svn info | awk '/^Revision:/ {print $2}'`
svndate=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`
now=`date`
cat <<EOF > svnversion.h
// Do not edit! This file was autogenerated
// by $0
// on $now
//
// svnrevision and svndate are as reported by svn at that point in time,
// compiledate and compiletime are being filled gcc at compilation
#include <stdlib.h>
static const char* svnrevision = "$svnrevision";
static const char* svndate = "$svndate";
static const char* compiletime = __TIME__;
static const char* compiledate = __DATE__;
EOF
}
test -f svnversion.h || svnversion
Предполагается, что вы удалите созданный файл заголовка, чтобы запустить сборку нового файла.
Если вы просто хотите распечатать последнюю версию репозитория, вы можете использовать что-то вроде этого:
svn info <repository_url> -rHEAD | grep '^Revision: ' | awk '{print $2}'
Вы можете использовать capistrano для развертывания, он создает файл REVISION, который вы можете скопировать в открытый доступ. /version.txt
Кажется, что вы запускаете svn info
в каталоге, но svn update
в определенном файле. Если вы обновите каталог до версии 4571, svn info
должен напечатать:
Путь:.
URL: http: //my.url/trunk
Корень репозитория: http: //my.url/lesson%5Fplanner
UUID репозитория: #########
Версия: 4571
[...]
Последняя измененная версия: 4571
Обратите внимание, что «последняя измененная версия» не обязательно совпадает с последней версией репозитория.
Спасибо всем, кто предложил capistrano и svninfo.
Мы действительно используем capistrano, и он действительно создает этот файл REVISION, который, я думаю, я видел раньше, но не обращал внимания на . Однако на самом деле это не совсем то, что мне нужно, потому что он обновляется только при развертывании, тогда как иногда мы можем незаметно обновить пару файлов, а затем перезапустить, а не выполнять полное развертывание.
В итоге я создал свой собственный файл, используя svninfo, grep и awk, как предлагали многие люди, и выложил его в открытый доступ. Он создается при запуске mongrel, который является частью процесса развертывания и процесса перезапуска, поэтому выполняется в обоих случаях.
Всем спасибо!