Использование свойств


Команда svn предоставляет несколько способов добавления или изменения свойств файлов и директорий. Свойства с короткими, читаемыми значениями, наверное проще всего добавить указав имя и значение свойства в командной строке подкоманды propset.

$ svn propset copyright '(c) 2003 Red-Bean Software' calc/button.c property 'copyright' set on 'calc/button.c' $

Однако мы уже знаем о гибкости, предлагаемой Subversion для значений свойств. И если вам необходимо иметь многострочное текстовое, или даже бинарное значение свойства, передавать такое значение через командную строку не удобно. Для таких случаев команда propset имеет параметр --file (-F), указывающий имя файла, содержащего новое значение свойства.

$ svn propset license -F /path/to/LICENSE calc/button.c property 'license' set on 'calc/button.c' $

Для имен свойств существует ряд ограничений. Имя свойства должно начинаться с буквы, двоеточия (:) или подчеркивания (_); дальше можно использовать цифры, тире (-) и точки (.). [36]

Дополнительно к команде propset, svn имеет команду propedit. Эта команда использует для добавления или изменения свойств указанную программу-редактор (см. «Config»). При выполнении команды, svn вызывает редактор с временным файлом, содержащим текущее значение свойства (или с пустым файлом, если добавляется новое свойство). Затем вы просто меняете в редакторе значение, пока оно не станет таким, каким бы вы хотели его видеть, сохраняете временный файл и выходите из редактора. Если Subversion обнаружит, что вы действительно изменили существующие значение свойства, будет установлено новое значение. Если вы вышли из редактора не внеся изменений, модификации свойства не произойдет.

$ svn propedit copyright calc/button.c ### exit the editor without changes No changes to property 'copyright' on 'calc/button.c' $

Обращаем ваше внимание на то, что как и другие команды svn, команды, относящиеся к свойствам могут применяться к нескольким путям за раз. Это дает возможность одной командой изменять свойства целого набора файлов. Например, можно сделать вот так:

$ svn propset copyright '(c) 2002 Red-Bean Software' calc/* property 'copyright' set on 'calc/Makefile' property 'copyright' set on 'calc/button.c' property 'copyright' set on 'calc/integer.c' … $

Все эти добавления и редактирования свойств не очень полезны, если нельзя просто узнать значение свойства. Поэтому для показа сохраненных для файлов и директорий имен и значений свойств, программа svn предлагает две подкоманды. Команда svn proplist перечисляет существующие для указанного пути свойства. После того как вы знаете имя свойства, можно, используя svn propget, запросить его значение. Эта команда выведет на стандартный поток ввода-вывода значение свойства для элемента по указанному пути (или путями) и с указанным именем.

$ svn proplist calc/button.c Properties on 'calc/button.c': copyright license $ svn propget copyright calc/button.c (c) 2003 Red-Bean Software

Существует даже вариант команды proplist, который перечисляет как имена, так и значения свойств. Просто добавьте параметр --verbose (-v).

$ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software license : ================================================================ Copyright (c) 2003 Red-Bean Software. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the recipe for Fitz's famous red-beans-and-rice. …

Последней, относящейся к свойствам подкомандой является propdel. Не смотря на то, что Subversion позволяет сохранять свойства с пустыми значениями, полностью удалить свойство, используя propedit или propset, нельзя. Например, такая команда не даст желаемого эффекта:

$ svn propset license '' calc/button.c property 'license' set on 'calc/button.c' $ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software license : $

Для полного удаления свойств необходимо использовать команду propdel. Ее синтаксис такой же как и у других команд работы со свойствами:

$ svn propdel license calc/button.c property 'license' deleted from ''. $ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software $

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

Редактирование свойств правок

Помните, мы говорили о неверсионированных свойствах правок? Их то же можно менять с помощью svn. Просто добавьте параметр командной строки --revprop и укажите правку, чье свойство вы хотите изменить. Учитывая глобальность правок, в этом случае не нужно указывать путь, так как вы находитесь в рабочей копии хранилища, в котором вы хотите изменить свойство правки. Например, может понадобиться заменить лог-сообщение фиксации в существующей правке. [37]

$ svn propset svn:log '* button.c: Fix a compiler warning.' -r11 --revprop property 'svn:log' set on repository revision '11' $

Обратите внимание на то, что изменение этих неверсионированных свойств должно быть явно разрешено администратором (см. «Hook Scripts»). Учитывая то, что свойства не версионируются, при не аккуратном редактировании, вы рискуете потерять информацию. Для исключения потери информации, администратор хранилища может принять меры предосторожности и по умолчанию, изменение неверсионированных свойств запрещено.

Так же как и в случае с содержимым файлов, изменение свойств является локальной модификацией и становится постоянной при ее фиксации в хранилище с помощью svn commit. Изменение свойств можно легко отменить — команда svn revert восстановит файлы и директории до их первоначального состояния, включая содержимое, свойства и все остальное. Кроме того, интересную информацию о состоянии свойств файлов и директорий можно получить с помощью команд svn status и svn diff.

$ svn status calc/button.c M calc/button.c $ svn diff calc/button.c Property changes on: calc/button.c ___________________________________________________________________ Name: copyright + (c) 2003 Red-Bean Software $

Обратите внимание на то, что подкоманда status показывает M не в первой, а во второй колонке. Это потому, что в calc/button.c изменились свойства, а текстовое содержимое нет. Если бы мы изменили и то и другое, в первой колонке то же была бы буква M (см. «svn status»).

Конфликты свойств

Так же как и в случае с содержимым файлов, локальные модификации свойств могут конфликтовать с изменениями, зафиксированными кем-то другим. При обновлении рабочей копии директории и получении изменений свойств для версионированного элемента, которые идут в разрез вашими собственными, Subversion сообщит о конфликтном состоянии элемента.

% svn update calc M calc/Makefile.in C calc/button.c Updated to revision 143. $

В директории с конфликтующим элементом Subversion создает файл с расширением .prej, с подробностями о конфликте. Для разрешения конфликта необходимо познакомиться с содержимым этого файла. Пока не будет решен конфликт, во второй колонке вывода команды svn status будет присутствовать буква C, а попытки фиксации локальных изменений будут отклоняться.

$ svn status calc C calc/button.c ? calc/button.c.prej $ cat calc/button.c.prej prop 'linecount': user set to '1256', but update set to '1301'. $

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

Кроме того нужно помнить о нестандартном подходе, используемом Subversion при выводе различий для свойств. Безусловно, можно запустить svn diff перенправить вывод, для создания работоспособного файла отличий. Програма patch будет просто игнорировать различия свойств — как правило, она игнорирует любой мусор, который неможет обработать. К сожалению, это значит, что для полного применения отличий, сгенерированных svn diff, изменения свойств нужно вносить в ручную.

Как видите, наличие измененных свойств никак не отражается на привычном рабочем цикле. Операции обновления рабочей копии, проверки статуса файлов и директорий, вывод сообщений о сделанных изменениях и фиксация этих измениий в хранилище никак не зависят от наличия или отсутствия свойств. У svn просто имеется несколько дополнительных подкоманд для внесения изменений в свойства однако это просто достойное внимания отличие.



Содержание раздела