Difference between revisions of "Creating A Patch/ru"
Line 35: | Line 35: | ||
См.также [[TortoiseSvn#Troubleshooting]], если у вас имеются проблемы . | См.также [[TortoiseSvn#Troubleshooting]], если у вас имеются проблемы . | ||
− | == | + | ==Создание патча с помощью Git== |
− | + | Во-первых, разрабатывайте свой код в отдельной ветке! | |
− | + | ||
+ | Пока ваша ветка разработки активна, вы можете создавать патчи всех ваших локальных коммитов: | ||
<syntaxhighlight lang="bash">git format-patch master</syntaxhighlight> | <syntaxhighlight lang="bash">git format-patch master</syntaxhighlight> | ||
− | + | Это создает набор исправлений с именами, такими как "0001-CommitMsg.patch", "0002-CommitMsg.patch" и так далее. | |
− | + | Если вы хотите, чтобы все изменения были внесены в один патч, либо объедините коммиты, используя "git rebase -i ...", либо используйте следующую команду: | |
<syntaxhighlight lang="bash">git format-patch master --stdout > mypatch.patch</syntaxhighlight> | <syntaxhighlight lang="bash">git format-patch master --stdout > mypatch.patch</syntaxhighlight> | ||
− | {{Note| "master" | + | {{Note| ветка "master" при использовании ссылки git-svn следует за транком SVN по умолчанию. |
− | + | Однако зеркальный репозиторий в GitHub вместо этого использует ветку "upstream". | |
− | + | Тогда вы должны заменить "master" на "upstream" в выше приведенных командах.}} | |
==Submitting the patch== | ==Submitting the patch== |
Revision as of 10:59, 30 August 2019
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
português (pt) │
русский (ru) │
slovenčina (sk) │
Если вы хотите отправить улучшения в код FPC или Lazarus, вам нужно отправить патч, который разработчики могут легко слить с исходным кодом.
Исключения:
- файлы перевода .po следует отправлять как целые файлы
- новые файлы должны быть отправлены как целые файлы с указанием места их размещения
Требования
Вам нужны версии Lazarus (или FPC) trunk/для разработки. Вы можете получить Lazarus(и FPC), используя SVN или Git.
- SVN: Версия Lazarus для разработчиков. Это родной репозиторий.
- Git: Git mirrors и Lazarus Git-svn. Лазарь зеркалируется в GitHub. Git также может использовать сервер SVN напрямую с помощью ссылки git-svn.
Предупреждение: Если вы отправляете исправления, не создавайте их на основе стабильных версиий Lazarus/FPC. Обычно версия для разработки сильно отличается от стабильной версии, так как разработчики применили множество улучшений и исправлений.
Отличия платформы
В инструкциях ниже предполагается, что вы открыли командную строку и переместились (команда cd) в каталог хранилища. Вот подробности:
Windows
Предполагая, что вы извлекли Lazarus в C:\lazarus, откройте командную строку (cmd.exe) и введите «cd \lazarus».
*nix systems
Предполагая, что вы извлекли Lazarus в ~/lazarus, откройте терминал и наберите "cd ~/lazarus".
Создание патча с использованием SVN
svn diff > mypatch.diff
Это включает в себя все измененные файлы во всем хранилище SVN.
Вы также можете определить отдельные файлы, чтобы убедиться, что туда не попал мусор, например. :
svn diff ide/main.pp ideintf/objectinspector.pp > mypatch.diff
См.также TortoiseSvn#Troubleshooting, если у вас имеются проблемы .
Создание патча с помощью Git
Во-первых, разрабатывайте свой код в отдельной ветке!
Пока ваша ветка разработки активна, вы можете создавать патчи всех ваших локальных коммитов:
git format-patch master
Это создает набор исправлений с именами, такими как "0001-CommitMsg.patch", "0002-CommitMsg.patch" и так далее.
Если вы хотите, чтобы все изменения были внесены в один патч, либо объедините коммиты, используя "git rebase -i ...", либо используйте следующую команду:
git format-patch master --stdout > mypatch.patch
Примечание: ветка "master" при использовании ссылки git-svn следует за транком SVN по умолчанию. Однако зеркальный репозиторий в GitHub вместо этого использует ветку "upstream".
Тогда вы должны заменить "master" на "upstream" в выше приведенных командах.Submitting the patch
Now you have a patch. I'd suggest to look the file over to see if it looks ok (no unexpected changes).
The recommended way to submit a patch is through the bug tracker, see How do I create a bug report for details. If there is a report for the issue your patch fixes, use that, otherwise create a new issue. Upload the file to attach it to the issue.
Using a forked Git repository directly
It is possible to use Git in a distributed manner also for Lazarus development. At least developers JuhaManninen and Alexander Klenin ("Ask") are ready to accept code in a Git repository.
In practice the repository must be forked from the Lazarus mirror in GitHub. The code must be in a separate branch and rebased against "upstream" branch. This is not tested yet, we can add more details here when somebody actually forks the repo and creates code.
The limitation of this model is that the code must belong to the area of expertise of the developers working with Git. If the code is outside that area, you can still use Git but you must create patches and send them to bug tracker.
Applying a patch
This explains how to apply somebody else's patch to your local repository. You can test the patch by using the --dry-run toggle switch like this:
patch --dry-run < somepatch.diff
The output of the patch program will be identical to the actual patching, only it does not alter the sourcecode files. Very handy for testing, without the possibility to screw up your source.
A patch made with "svn diff"
To do the final patching, use the following commandline:
patch < somepatch.diff
If that doesn't work because the path layout of your environment is different from the environment where the patch was created, you can tell patch to strip out all path information:
patch -p0 < somepatch.diff
Any GUI tool for diffs on Windows can handle these patches, too, including TortoiseMerge.
A patch made with "git format-patch"
Git
Git itself applies the patch like this :
git apply 0001-gitpatch.patch
patch
The "patch" command now supports git format patches with -p1. This is tested with patch v.2.6.1 on Linux, old versions may not support it.
patch -p1 < 0001-gitpatch.patch
"patch" is available for Windows, too, but there are also GUI tools for the job.
TortoiseMerge
TortoiseMerge supports the Git format patch without problems. It is installed together with Tortoise SVN but is not integrated in explorer. It must be opened from the Start menu.
ToDo: add more GUI tools that support Git format patches
Troubleshooting
Finally, patches may have a Unix/Linux line ending (LF) while your local file has Windows (CR+LF) line endings or vice versa. You'll have to convert the patch file before applying on Windows at least, as the supplied patch.exe is picky about line endings.
On Windows, the patch.exe supplied with FPC/Lazarus is very picky; you may have better luck with the patch.exe supplied by Git:
"C:\Program Files (x86)\Git\bin\patch.exe" -p0 < mypatch.diff
... or the svn patch command available since SVN 1.7.
See also
- How do I create a bug report general information on submitting bugs, what should be covered in a bug report, and using the bug tracker.
- Tips on writing bug reports detailed information on what should be covered in a bug report.
- Database bug reporting Specific info and sample programs for database bugs
- Moderating the bug tracker
==================
Инструкции по созданию патча
Предполагается, что Вы используете SVN версию Lazarus-а. Как получить Lazarus через SVN
Для Windows:
Откройте командную строку (Пуск->Выполнить->cmd) Предположим, что рабочая версия Лазаруса у находится в C:\lazarus (если Лазарус находится в другой папке, вам следует указать нужную в команде 'cd')
вводите следующие команды
cd c:\lazarus svn diff > mypatch.diff
Используя TortoiseSVN, вы можете создать патч без использования командной строки.
Для Linux/BSD/MacOSX и т.п.:
Предположим что Лазарус находится в директории: $HOME/lazarus
откройте любую используемую программу терминала: введите следующие команды:
cd $HOME/lazarus svn diff > mypatch.diff
В обоих случаях (Windows/*nix), по окончанию работы команды svn diff патч, будет записан в файле mypatch.diff (Если файл mypatch.diff существовал до запуска команды, то он будет перезаписан!)
Заметка: Просмотрите файл с патчем, чтобы в него не попали ненужные изменения
Лучше всего отправлять патчи, через баг трекер.
Если Вы предоставляете патч, к уже известной ошибке, то Вам следует приложить патч, к соответствующему сообщению (bug issue). Если Ваш патч, исправляет ошибку, которой о которой ещё не сообщено, Вам следует создать новое сообщение об ошибке.
Баг трекер позволит отслеживать, принят патч или нет.
Вы так же можете отправить патч на почтовую рассылку. Предварительно запакуйте файл (размер не должен превышать 40 килобайт), с помощью zip или gzip (не используйте другие архиваторы). Вы также можете послать по этому адресу patch@lazarus.dommelstein.net. Убедитесь, что в subject-e письма указано хотя бы слово patch, иначе письмо может быть отрезано спам-фильтром.
Применение изменений
Для автоматического изменения кода, в соответствии с имеющимся патч-файлом, используется утилита "patch"
Для Windows при установленном Лазарусе она находится в папке
lazarus\fpc\bin\*версия компилятора*\patch.exe
Для Unix-систем утилита обычно устанавливается вместе с установкой binutils. В MacOSX утилита устанавливается вместе с Xcode.
Перед внесением изменений, рекомендуется проверить, сможет ли утилита успешно внести изменения в существующий код. Это выполняется следующей командой:
patch --dry-run < mypatch.diff
где mypatch.diff - имя патч файла.
Сообщения, выдаваемые программой Patch, будут такими же, как и при внесении изменений, но исходный код не будет изменён. Удобно тем, что помогает избежать нежелательного частичного изменения существующего кода.
пример успешного применения патча:
$ patch --dry-run < svnclasses.pas.diff patching file svnclasses.pas Hunk #2 succeeded at 980 (offset 1 line).
пример ошибки при применении патча:
$ patch --dry-run < svnclasses.pas.diff patching file svnclasses.pas 2 out of 2 hunks ignored -- saving rejects to file svnclasses.pas.rej
Если никаких проблем не возникло, патч можно смело применять, следующей командой:
patch < mypatch.diff
для тех патчей, где участвую файлы из поддиректорий:
patch -p0 < mypatch.diff
Tortoise SVN
В TortoiseSVN встроена возможность применения патча.