Version Control with Subversion - Properties - Manipulating Properties
Manipulating Properties
The
svn
command affords a few ways to
add or modify file and directory properties. For properties
with short, human-readable values, perhaps the simplest way to
add a new property is to specify the property name and value
on the command-line of the
propset
subcommand.
$ svn propset copyright '(c) 2003 Red-Bean Software' calc/button.c
property 'copyright' set on 'calc/button.c'
$
But we've been touting the flexibility that Subversion
offers for your property values. And if you are planning to
have a multi-line textual, or even binary, property value, you
probably do not want to supply that value on the command-line.
So the
propset
subcommand takes a
--file (-F ) option for
specifying the name of
a file which contains the new property value.
$ svn propset license -F /path/to/LICENSE calc/button.c
property 'license' set on 'calc/button.c'
$
There are some restrictions on the names you can use for
properties. A property name must start with a letter, a colon
(: ), or an underscore
(_ ); after that, you can also use digits,
hyphens (- ), and periods
(. ).
[31]
In addition to the
propset
command, the
svn
program supplies the
propedit
command. This command uses the
configured editor program (see
the section called “Config”) to add or modify properties.
When you run the command,
svn
invokes your
editor program on a temporary file that contains the current
value of the property (or which is empty, if you are adding a
new property). Then, you just modify that value in your
editor program until it represents the new value you wish to
store for the property, save the temporary file, and then exit
the editor program. If Subversion detects that you've
actually changed the existing value of the property, it will
accept that as the new property value. If you exit your
editor without making any changes, no property modification
will occur.
$ svn propedit copyright calc/button.c ### exit the editor without changes
No changes to property 'copyright' on 'calc/button.c'
$
We should note that, as with other
svn
subcommands, those related to properties can act on multiple
paths at once. This enables you to modify properties on whole
sets of files with a single command. For example, we could
have done:
$ 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'
…
$
All of this property adding and editing isn't really very
useful if you can't easily get the stored property value. So
the
svn
program supplies two subcommands
for displaying the names and values of properties stored on
files and directories. The
svn proplist
command will list the names of properties that exist on a
path. Once you know the names of the properties on the node,
you can request their values individually using
svn
propget
. This command will, given a path (or set of
paths) and a property name, print the value of the property to
the standard output stream.
$ svn proplist calc/button.c
Properties on 'calc/button.c':
copyright
license
$ svn propget copyright calc/button.c
(c) 2003 Red-Bean Software
There's even a variation of the
proplist
command that will list both the
name and value of all of the properties. Simply supply the
--verbose (-v ) option.
$ 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.
…
The last property-related subcommand is
propdel
. Since Subversion allows you to
store properties with empty values, you can't remove a
property altogether using
propedit
or
propset
. For example, this command will
not
yield the desired effect:
$ 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 :
$
You need to use the
propdel
command to
delete properties altogether. The syntax is similar to the
other property commands:
$ svn propdel license calc/button.c
property 'license' deleted from 'calc/button.c'.
$ svn proplist --verbose calc/button.c
Properties on 'calc/button.c':
copyright : (c) 2003 Red-Bean Software
$
Now that you are familiar with all of the
property-related
svn
subcommands, let's see
how property modifications affect the usual Subversion
workflow. As we mentioned earlier, file and directory
properties are versioned, just like your file contents. As a
result, Subversion provides the same opportunities for
merging—in cleanly or conflicting fashions—someone
else's modifications into your own.
And as with file contents, your property changes are local
modifications, only made permanent when you commit them to the
repository with
svn commit
. Your property
changes can be easily unmade, too—the
svn
revert
command will restore your files and
directories to their un-edited states, contents, properties,
and all. Also, you can receive interesting information about
the state of your file and directory properties by using the
svn status
and
svn diff
commands.
$ 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
$
Notice how the
status
subcommand
displays M in the second column instead of
the first. That is because we have modified the properties on
calc/button.c , but not modified its
textual contents. Had we changed both, we would have seen
M in the first column, too (see
the section called “
svn status
”).
You might also have noticed the non-standard way that
Subversion currently displays property differences. You can
still run
svn diff
and redirect the output
to create a usable patch file. The
patch
program will ignore property patches—as a rule, it
ignores any noise it can't understand. This does
unfortunately mean that to fully apply a patch generated by
svn diff
, any property modifications will
need to be applied by hand.
As you can see, the presence of property modifications has
no outstanding effect on the typical Subversion workflow.
Your general patterns of updating your working copy, checking
the status of your files and directories, reporting on the
modifications you have made, and committing those
modifications to the repository are completely immune to the
presence or absence of properties. The
svn
program has some additional subcommands for actually making
property changes, but that is the only noticeable asymmetry.
[an error occurred while processing this directive]
|