Определение кодировки текста на PHP.

Данное решение в своей реализации опиралось на статью, опубликованную на Хабре

Краткое содержание идеи.

  1. Типичный текст на русском языке имеет вполне определённую частоту появления в нём определённых символов(этот принцип давно и успешно используется для взлома шифров, основанных на простой замене).
  2. Символы языка в различных кодировках имеют различные коды, и можно составить таблицу спектров (частоты появления кода символа), для каждой из кодировок.
  3. Проходя текст посимвольно, прибавляем частоту кода каждого символа в к соответствующей кодировке. Это как бы рейтинг кодировки
  4. Кодировка  с наибольшим рейтингом по завершению строки и считается кодировкой текста.

Что привнесено

  1. Добавил ещё одну важную кодировку: UTF-8.
  2. Причесал код.
  3. Собрал всё в одну библиотеку, готовую к употреблению.

На строках менее 10 кириллических символов детектор иногда ошибается, строки длиной 100 и более символов определяются практически безошибочно.

Скачать код

Пример использования

$charset = new charset();
$text = file_get_contents("before.html");
echo $charset->detect($text);

Компиляция Qt4 в Windows

Позаимствовано у Ю.В.Земскова. Лично не проверялось

Предварительные условия

  1. для работы со свободной версией Qt4 должен быть установлен компилятор MinGW (к сожалению, поддержка компилятора Microsoft C++ включена только в коммерческие версии Qt);
  2. путь к исполняемым файлам MinGW, находящимся в папке bin, должен быть указан в системной переменной PATH (напоминаем, что после редактирования значений переменных окружения требуется перезагрузить компьютер, чтобы все изменения вступили в силу).

Порядок установки

  1. Если ставится коммерческая версия Qt, то имеющийся файл лицензии скопируйте в каталог Documents and Settings\ИмяПользователя и дайте ему имя .qt-license.
  2. Распакуйте содержимое архива qt-win-opensource-src-4.x.x.zip или qt-win-commercial-src-4.2.2 в любой каталог, например, c:\qt422 (полное имя каталога не должно содержать пробелов).
  3. Добавьте путь к каталогу c:\qt422\bin в системную переменную PATH. Перезагрузите компьютер.
  4. Перейдите в каталог c:\qt422 и запустите программу configure.exe. Если используется Visual Studio .NET, то конфигурирование и компиляцию следует проводить в окне Visual Studio .NET Command Prompt. При запуске configure могут быть указаны параметры:
    • -platform x – платформа установки. Вместо x можно указать win32-g++, а для коммерческих версий Qt: win32-iccwin32-msvcwin32-msvc.net и win32-msvc2005;
    • -release – собирать только конфигурацию Release (без информации для отладки на уровне исходного текста);
    • -debug – собирать только конфигурацию Debug (с информацией для отладчика);
    • -debug-and-release – собирать обе конфигурации;
    • -shared – собирать динамические библиотеки;
    • -static – собирать статические библиотеки;
    • -exceptions – использовать исключения;
    • -no-exceptions – не использовать исключения;
    • -no-qt3support – не компилировать модули поддержки старой версии Qt3;
    • -fast – генерировать только те make-файлы, которые необходимы для компиляции библиотеки;

и многие другие. Полный список всех опций можно узнать, запустив configure с параметром -help.

В результате работы configure будут сгенерированы make-файлы для сборки библиотеки Qt, инструментов разработки и демонстрационных примеров. Не выходя из каталога установки, запустите процесс компиляции с помощью команды mingw32-make (или make, если используется Visual C++) и приготовьтесь к длительному ожиданию (несколько часов); Если ставилась коммерческая версия Qt, то установите интегратор с Microsoft Visual Studio, для этого запустите на выполнение файл qt-vsintegration-1.2.1.exe. После компиляции библиотеки Qt4 в каталоге bin появятся следующие исполняемые файлы:

  1. qmake – утилита для создания файла проекта *.pro и make-файлов;
  2. assistant – программа просмотра документации;
  3. designer – визуальный редактор графического интерфейса пользователя;
  4. moc – метакомпилятор, предназначенный для перевода исходных текстов программ, написанных с использованием библиотеки Qt, на обычный язык C++;
  5. uic – компилятор ui-файлов, создаваемых программой designer;
  6. rcc – компилятор qrc-ресурсов;
  7. qtdemo – оболочка для запуска демонстрационных программ;
  8. linguist – инструмент, облегчающий перевод интерфейса приложений на другие языки;
  9. qt3to4 – утилита для конвертации старых программ, разработанных с использованием 3-й версии библиотеки;
  10. lupdatelrelease – утилиты для для интернационализации приложений.

Простейшее QT4 приложение

Исходный код

Создадим каталок проекта hello_world. В нем — подкаталог для исходных кодов src и файл src/hello.cpp и разместим там следующий код

#include <QApplication>
#include <QMainWindow>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QMainWindow *mw = new QMainWindow(0, Qt::Window);

    mw->setWindowTitle("Hello WORLD");
    mw->resize(400, 300);
    mw->show();

    return app.exec();
}

Подготовка проекта

Создадим файл проекта

Debian, Ubuntu

Зайдем в каталог проекта и выполним в консоли

qmake-qt4 -project -recursive -o hello.pro

Утилита qmake-qt4 создаст файл проекта hello.pro

Mandriva

Зайдем в каталог проекта и выполним

/usr/lib/qt4/bin/qmake -project -recursive -o hello.pro

Утилита qmake создаст файл проекта hello.pro

Windows

 

Создание Makefile(конфиг сборки проекта)

Debian, Ubintu

qmake-qt4 -makefile -recursive

Mandriva

/usr/lib/qt4/bin/qmake -makefile -recursive

Windows

 

Сборка проекта

Debian, Ubintu, Mandriva

make

Должен быть примерно такой вывод в консоль (без сообщений об ошибках, в идеале и без warning ;-))

$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib/qt4/mkspecs/linux-g++ -I. -I/usr/lib/qt4/include/QtCore -I/usr/lib/qt4/include/QtCore -I/usr/lib/qt4/include/QtGui -I/usr/lib/qt4/include/QtGui -I/usr/lib/qt4/include -I. -I. -I. -o hello.o src/hello.cpp
src/hello.cpp:15:4: warning: no newline at end of file
g++ -Wl,-rpath,/usr/lib/qt4/lib -o hello hello.o    -L/usr/lib/qt4/lib -lQtGui -L/usr/lib -L/usr/lib/qt4/lib -L/usr/X11R6/lib -lpng -lSM -lICE -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -lrt -ldl -lpthread

Тут мы четко наблюдаем процесс компиляции и линковки.

В результате сборки должен появиться исполняемый файл hello

Windows

 

Запуск приложения

Debian, Ubintu, Mandriva

Просто запустить получившийся исполняемый файл

./hello

Windows

 

Результат работы

Если предыдущие пункты были успешны, результатом будет являться примерно такое окошко:


Установка QT 4 на ОС Linux(Debian, Ubuntu, Mandriva)

Для разработки приложений на QT4 нам понадобятся не только бинарные библиотеки, но и заголовочные файлы. Традиционно подобные файлы содержатся в пакетах с окончанием -devel

Установка из исходных кодов

Я её не рекомендую, дабы не быть потом мишенью для реплик неприятного содержания. В общем случае установка любого ПО из исходных кодов более нетривиальна, чем использование штатного репозитария любимого дистрибутива.

FIXME

Debian, Ubuntu

Посмотрим, что для разработки на QT4 содержится в репозитарии.

# apt-cache search ^qt4\-
qt4-demos - Qt 4 examples and demos
qt4-designer - graphical designer for Qt 4 applications
qt4-dev-tools - Qt 4 development tools
qt4-doc - Qt 4 API documentation
qt4-doc-html - Qt 4 API documentation (HTML format)
qt4-qmake - Qt 4 qmake Makefile generator tool
qt4-qtconfig - Qt 4 configuration tool

Какие из этих пакетов надо ставить?

Ставьте все. Не жадничайте.

Даже все вместе эти библиотеки займут на вашем жестком диске места в разы(может даже на порядки) меньше, чем средний художественный фильм в паршивом качестве ;-).

# apt-get install qt4-demos qt4-designer qt4-dev-tools qt4-doc qt4-doc-html qt4-qmake qt4-qtconfig

Mandriva

Состав пакетов тут тот же самый, что и в Debian. Только менеджер пакетов другой. Кстати, никто не мешает для установки использовать drakrpmsynaptic или другой графический менеджер пакетов.

Но будьте внимательны. Когда я пытался компилировать проект на Mandriva 2008, столкнулся с интересной его особенностью: путь к qmake во время создания проекта надо указывать полностью, в противном случае он предпримет попытку собрать его используя QT3. В Debian и AltLinux во избежание путаницы qmake называется qmake-qt4


Установка и начальная настройка PostgreSQL

Установка

Установка пакетов

Установка будет проведена на примере mandriva 2006, postgresql входит в состав этого дистрибутива. В других дистрибутивах процесс установки может выглядеть по другому, может быть проведена установка из исходных кодов.

[root@localhost home]# urpmi postgresql

Для удовлетворения зависимостей будут установлены следующие 2 пакетов (4 МБ):

libpq4-8.0.3-2mdk.i586

postgresql-8.0.3-2mdk.i586

Это правильно? (y/n) y

Кроме небходимых библиотек и исполняемых файлов создаётся так же пользователь postgres от которого будет работат СУБД. Также потребуется процедурный языкpl/pgsql, который доставляется отдельно

[root@localhost home]# urpmi plpgsql

Для удовлетворения зависимостей будут установлены следующие 2 пакетов (9 МБ):

postgresql-plpgsql-8.0.3-2mdk.i586

postgresql-server-8.0.3-2mdk.i586

Это правильно? (y/n) y

Инициализация

Создадим каталог для БД, назначим ему нужные права, и сменим пользователя на postgres, так как от root нам работать с БД никто не позволит :-)

[root@localhost home]# mkdir /home/postgres

[root@localhost home]# mkdir /home/postgres/data

[root@localhost home]# chmod -r 700 postgres/

[root@localhost home]# chown -r postgres:postgres /home/postgres/

[root@localhost home]# su postgres

Создадим файлы, необходимые для функционирования СУБД.

bash-3.00$ initdb /home/postgres/data

Произведём запуск сервера. Это можно сделать как из пользователя postgres.

bash-3.00$ postmaster -d /home/postgres/data/

Так и от root, как и любую другую службу

[root@localhost home]# /etc/init.d/postgresql start

Теперь сервер postgresql стартовал и готов принимать запросы.

Начальная настройка

Создание пользователей и баз данных.

Прежде всего создадим БД test_db, с которой будем работать

bash-3.00$ createdb test_db

Создадим пользователя test_db с паролем test_db.

bash-3.00$ createuser -p test_db_user

Введите пароль для нового пользователя:

Введите снова:

Разрешить новому пользователю создавать базы данных? (y/n) y

Разрешить новому пользователю создавать пользователей? (y/n) y

create user

Добавим возможность использовать процедурный язык pl/pgsql в БД test_db

bash-3.00$ createlang plpgsql test_db

Интерактивный терминал psql

Запустим psql — интерактивный терминал postgresql от пользователя postgres для созданной БД test_db.

bash-3.00$ psql test_db

Добро пожаловать в psql 8.0.3 - Интерактивный Терминал postgresql.

Наберите:  \copyright для условий распространения

           \h для подсказки по sql командам

           \? для подсказки по командам psql

           \g или наберите ";" для завершения запроса и его выполнения

           \q для выхода

Информация по командам интерактивного режима можно получить по команде

test_db="#" \?

Подсказка по командам sql доступна следующим образом:

test_db="#" \h

Например для получения справки по команде назначения привелегий grant

test_db="#" \h grant

Команда:   grant

Описание:  определить привилегии доступа

Синтаксис:

grant { { select | insert | update | delete | rule | references | trigger }

    [,...] | all [ privileges ] }

    on [ table ] tablename [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

grant { { create | temporary | temp } [,...] | all [ privileges ] }

    on database dbname [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

grant { execute | all [ privileges ] }

    on function funcname ([type, ...]) [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

grant { usage | all [ privileges ] }

    on language langname [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

grant { { create | usage } [,...] | all [ privileges ] }

    on schema schemaname [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

grant { create | all [ privileges ] }

    on tablespace tablespacename [, ...]

    to { username | group groupname | public } [, ...] [ with grant option ]

Назначение привилегий.

Назначим пользователю test_db_user все привилегии на БД test_db

test_db="#" grant all privileges on database test_db to test_db_user with grant
option;

Всё. Теперь можно заходить от пользователя test_db_user и работать в БД test_db.

bash-3.00$ psql -u test_db_user -d test_db -w

Пароль:

Подведём итог:

  1. устанавливаем postgresql;
  2. устанавливаем plpgsql;
  3. создаём каталог для файлов СУБД;
  4. инициализируем СУБД;
  5. создаём базу данных;
  6. создаём пользователя;
  7. добавляем возможность использовать процедурный язык pl/pgsql;
  8. назначаем привилегии для пользователя.

Subversion. Быстрый старт.

Установка subversion

Установка рассматривается на примере Debian 4.0 Etch. Без премудростей, штатными средствами, через apt-get

# apt-get install subversion

Subversion входит в состав этого дистибутива и имеет версию:

$ svn --version
svn, version 1.4.2 (r22196)
   compiled Nov 10 2006, 17:39:50

Начало работы с проектом в хранилище

Для хранилища лучше подобрать место понадёжнее. Если возможно — на отдельном разделе жесткого диска. Если настрой совсем серьёзный — то на отдельном диске. У меня подобные вещи хранятся в /home (на отдельном разделе). Для SVN — хранилища /home/svn

Создание хранилища для проекта

Создаём новое хранилище для проекта

$ svnadmin create /home/svn/test
$ ls -l /home/svn/test
итого 28
drwxr-xr-x 2 r-asian r-asian 4096 2008-01-03 17:57 conf
drwxr-xr-x 2 r-asian r-asian 4096 2008-01-03 17:57 dav
drwxr-sr-x 5 r-asian r-asian 4096 2008-01-03 17:57 db
-r--r--r-- 1 r-asian r-asian    2 2008-01-03 17:57 format
drwxr-xr-x 2 r-asian r-asian 4096 2008-01-03 17:57 hooks
drwxr-xr-x 2 r-asian r-asian 4096 2008-01-03 17:57 locks
-rw-r--r-- 1 r-asian r-asian  229 2008-01-03 17:57 README.txt

svnadmin создаёт каталог хранилища /home/svn/test для нашего проекта. 1. По своей сути хранилище subversion — это своя файловая система, хранящая информацию по всем производимым в проекте изменениям.

Первое размещение документов в хранилище

Итак, хранилище для проекта test было создано в разделе 2.1. Самое время разместить в нём наш проект — произвести импорт.

Создадим каталог /tmp/test и в нём 3 подкаталога: branchestagstrunk и в trunk скопируем файлы нашего проекта

$ tree --dirsfirst /tmp/test
/tmp/test
|-- branches
|-- tags
`-- trunk
    |-- css
    |   `-- main.css
    |-- images
    |   |-- logo.jpg
    |   |-- person.png
    |   |-- talks.png
    |   `-- tools.png
    |-- js
    |   `-- scripts.js
    |-- libs
    |   |-- config.lib.php
    |   `-- users.lib.php
    `-- index.php

7 directories, 9 files

Импортируем каталоги проекта в хранилище

$ svn import /tmp/test file:///home/svn/test -m "Комментарий к импорту"
Adding         /tmp/test/trunk
Adding         /tmp/test/trunk/images
Adding  (bin)  /tmp/test/trunk/images/logo.jpg
Adding  (bin)  /tmp/test/trunk/images/talks.png
Adding  (bin)  /tmp/test/trunk/images/tools.png
Adding  (bin)  /tmp/test/trunk/images/person.png
Adding         /tmp/test/trunk/css
Adding         /tmp/test/trunk/css/main.css
Adding         /tmp/test/trunk/libs
Adding         /tmp/test/trunk/libs/config.lib.php
Adding         /tmp/test/trunk/libs/users.lib.php
Adding         /tmp/test/trunk/js
Adding         /tmp/test/trunk/js/scripts.js
Adding         /tmp/test/trunk/index.php
Adding         /tmp/test/branches
Adding         /tmp/test/tags

Committed revision 1.

Таким образом создана ревизия(правильнее её называть редакцией)проекта за номером 1.

Основные операции со своей копией проекта

Вся работа с SVN ведётся по схеме:

  • получение локальной копии;
  • правка локальной копии;
  • слияние локальной копии и хранилища.

Под локальной копией будем понимать совокупность файлов проекта и служебных файлов subversion, скопированных для изменения в отдельный каталог.

Получение локальной копии

Все правки проекта, как уже говорилось, проводятся не в самом хранилище, а с его локальной копией. Локальную копию можно сделать как с самой последней редакции(ревизии) проекта, так и с произвольной, имевшей место в прошлом.

Получение информации о редакциях проекта

Выясним какие редакции проекта лежат в хранилище:

$ svn log file:///home/svn/test
------------------------------------------------------------------------
r1 | r-asian | 2008-01-03 19:08:54 +0400 (Чтв, 03 Янв 2008) | 1 line

Комментарий к импорту
------------------------------------------------------------------------

Чтобы узнать какие файлы были затроныты во время каждой редакции, добавим ключик -v

$ svn log -v file:///home/svn/test
------------------------------------------------------------------------
r1 | r-asian | 2008-01-03 19:08:54 +0400 (Чтв, 03 Янв 2008) | 1 line
Changed paths:
   A /branches
   A /tags
   A /trunk
   A /trunk/css
   A /trunk/css/main.css
   A /trunk/images
   A /trunk/images/logo.jpg
   A /trunk/images/person.png
   A /trunk/images/talks.png
   A /trunk/images/tools.png
   A /trunk/index.php
   A /trunk/js
   A /trunk/js/scripts.js
   A /trunk/libs
   A /trunk/libs/config.lib.php
   A /trunk/libs/users.lib.php

Комментарий к импорту
------------------------------------------------------------------------

Чтобы вывести редакции только с номерами в определённом диапазоне(в нашем случае у нас пока только одна редакция), воспользуемся конструкцией -r {начальный номер редакции}:{конечный номер редакции}

$ svn log -r 1:1  file:///home/svn/test
------------------------------------------------------------------------
r1 | r-asian | 2008-01-03 19:08:54 +0400 (Чтв, 03 Янв 2008) | 1 line

Комментарий к импорту
------------------------------------------------------------------------

Если мы попытаемся указать в диапазоне несуществующий номер редакции, будет выведено сообщение об ошибке:

$ svn log -r 1:2  file:///home/svn/test
svn: No such revision 2

Так же можно вывести список редакций, у которых дата помещения в хранилище лежит в определённом диапазоне. Например для получения списка редакций в диапазоне от 3 янваля 2008 г. 00:00 по 4 янваля 2008 г. 00:00:

$ svn log -r {2008-01-03}:{2008-01-04}  file:///home/svn/test
------------------------------------------------------------------------
r1 | r-asian | 2008-01-03 19:08:54 +0400 (Чтв, 03 Янв 2008) | 1 line

Комментарий к импорту
------------------------------------------------------------------------

Получение из хранилища определенной редакции проекта

Получим самую последнюю по времени редакцию проекта из хранилища, и разместим её в /tmp/workcopy:

$ svn checkout file:///home/svn/test/trunk /tmp/workcopy
A    /tmp/workcopy/images
A    /tmp/workcopy/images/logo.jpg
A    /tmp/workcopy/images/talks.png
A    /tmp/workcopy/images/tools.png
A    /tmp/workcopy/images/person.png
A    /tmp/workcopy/css
A    /tmp/workcopy/css/main.css
A    /tmp/workcopy/libs
A    /tmp/workcopy/libs/config.lib.php
A    /tmp/workcopy/libs/users.lib.php
A    /tmp/workcopy/js
A    /tmp/workcopy/js/scripts.js
A    /tmp/workcopy/index.php
Checked out revision 1.

Это и будет наша локальная копия. Если вывести полный список того, что в ней получилось:

$ tree -ad /tmp/workcopy
/tmp/workcopy
|-- .svn
|   |-- prop-base
|   |-- props
|   |-- text-base
|   `-- tmp
|       |-- prop-base
|       |-- props
|       `-- text-base
|-- css
|   `-- .svn
|       |-- prop-base
|       |-- props
|       |-- text-base
|       `-- tmp
|           |-- prop-base
|           |-- props
|           `-- text-base
|-- images
|   `-- .svn
|       |-- prop-base
|       |-- props
|       |-- text-base
|       `-- tmp
|           |-- prop-base
|           |-- props
|           `-- text-base
|-- js
|   `-- .svn
|       |-- prop-base
|       |-- props
|       |-- text-base
|       `-- tmp
|           |-- prop-base
|           |-- props
|           `-- text-base
`-- libs
    `-- .svn
        |-- prop-base
        |-- props
        |-- text-base
        `-- tmp
            |-- prop-base
            |-- props
            `-- text-base

44 directories

Видно, что кроме файлов и каталогов проекта есть специальный скрытый каталог .svn. В нем хранится информация о расположении и содержании файлов в текущем каталоге копии проекта. Такие скрытые подкаталоги есть во всех каталогах. Они не подлежат ни удалению ни изменению, являясь связующим звеном между локальной копией и хранилищем. Находящиеся в них файлы тоже не стоит править.

Обновление своей копии проекта из хранилища

Поскольку работа над проектом может вестись совместно, то в её ходе один из участников может в какой-то момент слить свою локальную копию(с внесёнными изменениями) в хранилище, оформив очередную редакцию проекта. Если такое произошло, то копии остальных участников работы перестают быть актуальными. Для восстановления актуальности необходимо обновить свою рабочую копию:

$ svn update /tmp/workcopy/
At revision 1.

В этом случае локальная копия будет обновлена до последней по времени редакции. Если необходимо обновить до редакции с определённым номером — воспользуемся ключом -r

$ svn update -r 1 /tmp/workcopy/
At revision 1.

Добавление в локальную копию новых файлов

Предположим, что был добавлен файл /tmp/workcopy/images/import_icon.jpg. Включим его в список файлов локальной копии хранилища.

$ svn add /tmp/workcopy/images/import_icon.jpg
A  (bin)  /tmp/workcopy/images/import_icon.jpg

Теперь SVN может отслеживать изменения этого файла. До момента добавления этого файла как бы не существует, и никакие операции subversion с ним не проводит.

Если файлов добавляется достаточно большое количество, и все они лежат в известном нам каталоге, то можно ограничится указанием соответствующего каталога, а SVN добавит ещё не добавленые, а для добавленных выведет предупреждение. Предположим, что в локальной копии мы создали файлы: /tmp/workcopy/images/crazytux.png, /tmp/workcopy/libs/auth.lib.php. Добавим в локальное хранилище все недобавленные файлы в /tmp/workcopy/libs:

$ svn add /tmp/workcopy/libs/*
A         /tmp/workcopy/libs/auth.lib.php
svn: warning: '/tmp/workcopy/libs/config.lib.php' is already under version control
svn: warning: '/tmp/workcopy/libs/users.lib.php' is already under version control

и в/tmp/workcopy/images

$ svn add /tmp/workcopy/images/*
A  (bin)  /tmp/workcopy/images/crazytux.png
svn: warning: '/tmp/workcopy/images/import_icon.jpg' is already under version control
svn: warning: '/tmp/workcopy/images/logo.jpg' is already under version control
svn: warning: '/tmp/workcopy/images/person.png' is already under version control
svn: warning: '/tmp/workcopy/images/talks.png' is already under version control
svn: warning: '/tmp/workcopy/images/tools.png' is already under version control

Обзор сделанных в своей копии проекта изменений

Предположим, что в index.php в 1-х строчках заменили:

<?php
    include_once("libs/config.lib.php");

на

<?php
    include_once("libs/auth.lib.php");
    include_once("libs/config.lib.php");

Посмотрим чем отличается локальная копия проекта от последней по времени редакции в хранилище.

$ svn diff /tmp/workcopy/
Index: /tmp/workcopy/images/import_icon.jpg

===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: /tmp/workcopy/images/import_icon.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Index: /tmp/workcopy/images/crazytux.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: /tmp/workcopy/images/crazytux.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Index: /tmp/workcopy/libs/auth.lib.php
===================================================================
--- /tmp/workcopy/libs/auth.lib.php     (revision 0)
+++ /tmp/workcopy/libs/auth.lib.php     (revision 0)
@@ -0,0 +1,117 @@
+<?php
+ //....... Текст файла ........
+?>
Index: /tmp/workcopy/index.php
===================================================================
--- /tmp/workcopy/index.php     (revision 1)
+++ /tmp/workcopy/index.php     (working copy)
@@ -1,4 +1,5 @@
 <?php
+    include_once("libs/auth.lib.php");
     include_once("libs/config.lib.php");
     header("Content-type: text/html; charset=windows-1251");
 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

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

Если необходимо получить сравнение локальной копии с определённой редакцией проекта, воспользуемся уже хорошо известным ключиком -r.

$ svn diff -r 1 /tmp/workcopy/

Удаление файла из локальной копии проекта

Предположим, что ранее был добавлен файл /tmp/workcopy/.htaccess, в локальную копию хранилища.

$ touch /tmp/workcopy/.htaccess
$ svn add /tmp/workcopy/.htaccess
A         /tmp/workcopy/.htaccess

Чтобы удалить его не только из каталога, где располагается локальная копиея, но и самой локальной копии проекта, необходимо сначала его удалить физически, а затем и из svn:

$ rm /tmp/workcopy/.htaccess
$ svn delete /tmp/workcopy/.htaccess
D         /tmp/workcopy/.htaccess
svn: '/tmp/workcopy/.htaccess' does not exist

Фиксация своих изменений в хранилище

Итак. Все необходимые изменения сделаны, и локальную копию можно слить в хранилище, оформив как очередную редакцию проекта. Для начала, крайне рекомендуется обновить локальную копию, чтобы в нашу редакцию вошли так же правки, сделанные за время нашей работы, руками других участников проекта.

$ svn update /tmp/workcopy/
At revision 1.

Если не обнаружено никаких конфликтов — можно фиксировать свои изменения:

$ svn commit /tmp/workcopy/ -m "Комментарий к редакции проекта"
Adding  (bin)  images/crazytux.png
Adding  (bin)  images/import_icon.jpg
Sending        index.php
Adding         libs/auth.lib.php
Transmitting file data ....
Committed revision 2.

Получим информацию о редакциях нашего проекта и порадуемся:

$ svn log -v file:///home/svn/test
------------------------------------------------------------------------
r2 | r-asian | 2008-01-04 17:42:42 +0400 (Птн, 04 Янв 2008) | 1 line
Changed paths:
   A /trunk/images/crazytux.png
   A /trunk/images/import_icon.jpg
   M /trunk/index.php
   A /trunk/libs/auth.lib.php
Комментарий к редакции проекта
------------------------------------------------------------------------
r1 | r-asian | 2008-01-03 19:08:54 +0400 (Чтв, 03 Янв 2008) | 1 line
Changed paths:
   A /branches
   A /tags
   A /trunk
   A /trunk/css
   A /trunk/css/main.css
   A /trunk/images
   A /trunk/images/logo.jpg
   A /trunk/images/person.png
   A /trunk/images/talks.png
   A /trunk/images/tools.png
   A /trunk/index.php
   A /trunk/js
   A /trunk/js/scripts.js
   A /trunk/libs
   A /trunk/libs/config.lib.php
   A /trunk/libs/users.lib.php

Комментарий к импорту
------------------------------------------------------------------------

Резюме

В данной статье были рассмотрены такие вопросы как:

  • Установка subversion
  • Создание SVN хранилища под проект
  • Размещение файлов проекта в хранилище
  • Получение информации о редакциях проекта
  • Получение локальной копии хранилища нужной редакции
  • Работа с локальной копией хранилища
    • Обновление файлов локальной копии из хранилища
    • Добавление в локальную копию новых файлов
    • Обзор сделанных в локальной копии изменений
    • удаление из локальной копии новых файлов
    • Слияние локальной копии с хранилищем.

К сожалению в статье не рассотрены многие вопросы, например создания веток проекта и их слияние, но и без этих вопросов текст оказался довольно общирен, так что лучше отложить эту тему для более подходящего момента.