Getting Started/Sources/Subversion: Difference between revisions

From KDE TechBase
(add a link)
(made it more clear in the beginning, for newcomers, mentioned kde-qt)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Getting Started/Sources/Using Subversion with KDE}}
{{Template:I18n/Language Navigation Bar|Getting Started/Sources/Using Subversion with KDE}}  


{{TutorialBrowser|
{{TutorialBrowser|
Line 8: Line 8:


reading=[[Contribute/Send Patches|Contributing/Sending Patches]]|
reading=[[Contribute/Send Patches|Contributing/Sending Patches]]|
}}
}}  


== Abstract ==
== Abstract ==


This is a quick KDE-specific introduction for using subversion to access files and software in KDE's repositories. For comprehensive coverage of Subversion we recommend reading the book
This is a quick KDE-specific introduction for using subversion to access files and software in KDE's repositories. For comprehensive coverage of Subversion we recommend reading the book "[http://svnbook.red-bean.com/ Version Control with Subversion]".  
"[http://svnbook.red-bean.com/ Version Control with Subversion]".


== Getting started ==
== Getting started ==


In order to use the KDE Subversion repository, you will need two things:
In order to use the KDE Subversion repository, you will need a Subversion client program.


# A Subversion client program
<br>
# An account in our repository


Note: For anonymous read-only access use protocol "svn", no "yourname@" and server "anonsvn.kde.org" instead below.
If you only need SVN for checking out the sources (read-only), use the protocol: "svn" , at the server:&nbsp;"anonsvn.kde.org".  


'''Installing Subversion:''' instructions on installing the client are not
presented here. Refer to your system installation instructions to find out how
you can install Subversion. You will need version 1.1 at least. If you are
compiling from sources and want to access the KDE repository by https
(and not by svn+ssh), you will need SSL and ZLIB support,
so you will need the <tt>--with-ssl --with-zlib</tt> options.


Alternatively, you can install one of the many graphical clients out there.
This tutorial is intended for people using the <tt>svn</tt> program only, referring
to tasks accomplished with the usual <tt>cvs</tt> program.


'''Getting an account:''' if you had a CVS
So for example, instead of what you see throughout this tutorial, your paths would show a similarity to this: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdevelop
account before, it has been migrated to the new Subversion client. If
 
you didn't, refer to the [[Contribute/Get_a_SVN_Account|corresponding tutorial]] how to get one.
 
 
Note: Wherever it mentions "yourname@", http, https, or passwords, you should ignore those and use what is mentioned. None of that stuff is needed for the anonymous server.
 
<br>
 
If you would like to commit changes to the repository, you will need an SVN account, which is obtainable here:&nbsp;[http://techbase.kde.org/Contribute/Get_a_SVN_Account get an SVN Account].
 
 
 
----
 
 
'''Installing Subversion:''' instructions on installing the client are not presented here. Refer to your system installation instructions to find out how you can install Subversion. You will need version 1.1 at least. If you are compiling from sources and want to access the KDE repository by https (and not by svn+ssh), you will need SSL and ZLIB support, so you will need the <tt>--with-ssl --with-zlib</tt> options.
 
Alternatively, you can install one of the many graphical clients out there(for example, kdesvn, albeit unofficial). This tutorial is intended for people using the <tt>svn</tt> program only, referring to tasks accomplished with the usual <tt>cvs</tt> program.
 
'''Getting an account:''' if you have had a CVS account before, it has been migrated to the new Subversion client.  


{{Note|If you have lost your CVS password, there are simple ways to retrieve
{{Note|If you have lost your CVS password, there are simple ways to retrieve
it. Use [http://ktown.kde.org/~coolo/cvspwd.c cvspwd.c] or [http://kdab.net/~dfaure/cvs-unscramble cvs-unscramble] (Perl).}}
it. Use [http://ktown.kde.org/~coolo/cvspwd.c cvspwd.c] or [http://kdab.net/~dfaure/cvs-unscramble cvs-unscramble] (Perl).}}  


== The KDE repository structure ==
== The KDE repository structure ==


  svn.kde.org/home/kde
  svn.kde.org/home/kde


That's the address of the KDE Subversion repository. The repository is served by
That's the address of the KDE Subversion repository. The repository is served by HTTPS or SVN+SSH protocol, which means your password is secure against third-party eavesdropping.  
HTTPS or SVN+SSH protocol, which means your password is secure against third-party
 
eavesdropping.
The SSL certificate md5 fingerprint for the repositories:


The SSL certificate md5 fingerprint for the repositories:
  F6BF EDE2 D016 D1B2  4F18 742E 2C8F B7EF
  F6BF EDE2 D016 D1B2  4F18 742E 2C8F B7EF


The SSL certificate sha1 fingerprint for the repositories:
The SSL certificate sha1 fingerprint for the repositories:  
 
  e1:e6:41:96:3c:eb:ae:78:e2:73:0d:a2:32:2f:6b:21:13:bf:3d:0f
  e1:e6:41:96:3c:eb:ae:78:e2:73:0d:a2:32:2f:6b:21:13:bf:3d:0f


For people using svn+ssh, here's the fingerprint of the server's RSA key:
For people using svn+ssh, here's the fingerprint of the server's RSA key:  
 
  86:f3:66:06:20:74:81:d0:1b:b4:2f:25:03:f7:8e:fb
  86:f3:66:06:20:74:81:d0:1b:b4:2f:25:03:f7:8e:fb


The repository is organised in main directories:
The repository is organised in main directories:  


# /branches
#/branches  
# /tags
#/tags  
# /trunk
#/trunk


You can explore the repository structure at [http://websvn.kde.org/ http://websvn.kde.org/]
You can explore the repository structure at [http://websvn.kde.org/ http://websvn.kde.org/]  


<br>


=== The top-level directory /trunk ===
=== The top-level directory /trunk ===


The <tt>/trunk</tt>
The <tt>/trunk</tt> top-level subdirectory is where the main development for KDE occurs. What you will find here is what will become the next KDE release and its associated programs. Here you will also find the <tt>www</tt> module, which contains webpages for KDE's site and related ones.  
top-level subdirectory is where the main development for KDE occurs.
What you will find here is what will become the next KDE release and
its associated programs. Here you will also find the <tt>www</tt> module,
which contains webpages for KDE's site and related ones.


<tt>/trunk</tt> is further subdivided into these sub-directories:
<tt>/trunk</tt> is further subdivided into these sub-directories:  


*<tt>KDE/</tt><br/>KDE itself, what will become the next public release. It contains the following modules:
*<tt>KDE/</tt><br>KDE itself, what will become the next public release. It contains the following modules:  
**'''kdelibs''' - KDE basic libraries, used by all KDE programs
**'''kdelibs''' - KDE basic libraries, used by all KDE programs  
**'''kdebase''' - KDE base programs, like the KDE Control Center, Kicker (the panel) and Konqueror (the web browser)
**'''kdebase''' - KDE base programs, like the KDE Control Center, Kicker (the panel) and Konqueror (the web browser)  
**'''kdeaccessibility''' - Accessibility files
**'''kdeaccessibility''' - Accessibility files  
**'''kdeadmin''' - KDE Administration applications
**'''kdeadmin''' - KDE Administration applications  
**'''kdeartwork''' - Images, themes, sounds and other art files
**'''kdeartwork''' - Images, themes, sounds and other art files  
**'''kdebindings''' - Bindings for languages other than C++
**'''kdebindings''' - Bindings for languages other than C++  
**'''kdeedu''' - KDE Educational applications
**'''kdeedu''' - KDE Educational applications  
**'''kdegames''' - KDE Games
**'''kdegames''' - KDE Games  
**'''kdegraphics''' - KDE Graphical applications
**'''kdegraphics''' - KDE Graphical applications  
**'''kdemultimedia''' - KDE Multimedia applications
**'''kdemultimedia''' - KDE Multimedia applications  
**'''kdenetwork''' - KDE Networking applications
**'''kdenetwork''' - KDE Networking applications  
**'''kdepim''' - KDE Personal Information Management applications
**'''kdepim''' - KDE Personal Information Management applications  
**'''kdepimlibs''' - Libraries used by KDE-PIM applications.
**'''kdepimlibs''' - Libraries used by KDE-PIM applications.  
**'''kdesdk''' - KDE Software Development Kit applications
**'''kdesdk''' - KDE Software Development Kit applications  
**'''kdetoys''' - KDE toy applications
**'''kdetoys''' - KDE toy applications  
**'''kdeutils''' - KDE General utilities
**'''kdeutils''' - KDE General utilities  
**'''kdevelop''' - The KDevelop program
**'''kdevelop''' - The KDevelop program  
**'''kdevplatform''' - The development platform which KDevelop is based on
**'''kdevplatform''' - The development platform which KDevelop is based on  
**'''kdewebdev''' - KDE Web development applications
**'''kdewebdev''' - KDE Web development applications  
*<tt>kde-common</tt>
*<tt>kde-common</tt>
:Common admin/ directory
:Common admin/ directory
*<tt>bugs/</tt>
*<tt>bugs/</tt>
:[http://bugs.kde.org/ Bugzilla] files
:[http://bugs.kde.org/ Bugzilla] files
*<tt>developer.kde.org/</tt>
*<tt>developer.kde.org/</tt>
:The content of developer.kde.org
:The content of developer.kde.org
*<tt>extragear/</tt>
*<tt>extragear/</tt>
:KDE programs outside the main KDE releases.
:KDE programs outside the main KDE releases.
*<tt>kdereview/</tt>
*<tt>kdereview/</tt>
:Temporary home for KDE applications that are believed to have reached release-quality. From here, once all major issues are resolved, applications are moved either to <tt>/trunk/KDE/</tt> or to <tt>/trunk/extragear/</tt>
:Temporary home for KDE applications that are believed to have reached release-quality. From here, once all major issues are resolved, applications are moved either to <tt>/trunk/KDE/</tt> or to <tt>/trunk/extragear/</tt>
*<tt>kdesupport/</tt>
*<tt>kdesupport/</tt>
:Supporting applications and libraries for KDE
:Supporting applications and libraries for KDE
*<tt>koffice/</tt><br/>The KDE Office suite, containing the programs:
 
**'''karbon'''
*<tt>koffice/</tt><br>The KDE Office suite, containing the programs:  
**'''kchart'''
**'''karbon'''  
**'''kexi'''
**'''kchart'''  
**'''kformula'''
**'''kexi'''  
**'''kivio'''
**'''kformula'''  
**'''koshell'''
**'''kivio'''  
**'''kplato'''
**'''koshell'''  
**'''kpresenter'''
**'''kplato'''  
**'''krita'''
**'''kpresenter'''  
**'''kspread'''
**'''krita'''  
**'''kugar'''
**'''kspread'''  
**'''kword'''
**'''kugar'''  
**'''kword'''  
*<tt>konstruct/</tt>
*<tt>konstruct/</tt>
:Konstruct, the KDE build program
:Konstruct, the KDE build program
*<tt>l10n-kde3/</tt>
*<tt>l10n-kde3/</tt>
:Translations for the "unstable" modules of KDE 3 (extragear, playground)
:Translations for the "unstable" modules of KDE 3 (extragear, playground)
*<tt>l10n-kde4/</tt>
*<tt>l10n-kde4/</tt>
:Translations for KDE 4
:Translations for KDE 4
*<tt>playground/</tt>
*<tt>playground/</tt>
:The KDE playground: applications being developed, but not having yet reached release-quality.
:The KDE playground: applications being developed, but not having yet reached release-quality.
*<tt>qt-copy/</tt>
*<tt>qt-copy/</tt>
:The convenience copy of [http://www.trolltech.com/ Trolltech's] Qt library, which KDE is based upon.
 
:The convenience copy of [http://www.trolltech.com/ Trolltech's] Qt library, which KDE is based upon. Remember, this is deprecated, you should be using the git repository, kde-qt instead. Qt-copy is at version 4.5, yet trunk '''requires '''
 
*<tt>tests/</tt>
*<tt>tests/</tt>
:khtml, KOffice and ksvg testcases
:khtml, KOffice and ksvg testcases
*<tt>valgrind/</tt>
*<tt>valgrind/</tt>
:The Valgrind application, which is hosted on the KDE repository, but that is not part of KDE itself. Note that newer versions of Valgrind are developed on their own repository. The KDE Valgrind modules only holds up to Valgrind 2.4.
 
:The Valgrind application, which is hosted on the KDE repository, but that is not part of KDE itself. Note that newer versions of Valgrind are developed on their own repository. The KDE Valgrind modules only holds up to Valgrind 2.4.
 
*<tt>www/</tt>
*<tt>www/</tt>
:Webpages for the KDE site (and related sites). Write access to this directory is restricted.
:Webpages for the KDE site (and related sites). Write access to this directory is restricted.


=== The top-level directory <tt>/tags</tt> ===
=== The top-level directory <tt>/tags</tt> ===


This
This directory contains the official releases of the programs maintained and developed in the KDE repository. Each individual application has a subdirectory here. Inside it, you will find the release numbers.  
directory contains the official releases of the programs maintained and
developed in the KDE repository. Each individual application has a
subdirectory here. Inside it, you will find the release numbers.


For instance, the KDE 3.4.0 code can be found under <tt>/tags/KDE/3.4.0/</tt>.
For instance, the KDE 3.4.0 code can be found under <tt>/tags/KDE/3.4.0/</tt>.  


=== The top-level directory <tt>/branches</tt> ===
=== The top-level directory <tt>/branches</tt> ===


This directory contains the branch versions of the applications after a major release.
This directory contains the branch versions of the applications after a major release.  


Most
Most KDE applications adhere to the philosphy that new features (as well as new user-visible strings) are added only to the next release cycle the one that lives in <tt>/trunk/</tt>. However, bugfixes are applied to all applications, even after release.  
KDE applications adhere to the philosphy that new features (as well as
new user-visible strings) are added only to the next release cycle &#8212;
the one that lives in <tt>/trunk/</tt>. However, bugfixes are applied to all
applications, even after release.


In
In order to do that, a branch is created at the moment of the release, indicating the state of the files at that time. Bugfixes are then checked in to those files. Those branches are the ones in <tt>/branches/</tt>.  
order to do that, a branch is created at the moment of the release,
indicating the state of the files at that time. Bugfixes are then
checked in to those files. Those branches are the ones in <tt>/branches/</tt>.


For instance, the KDE 3.4.x branch can be found under <tt>/branches/KDE/3.4/</tt>
For instance, the KDE 3.4.x branch can be found under <tt>/branches/KDE/3.4/</tt>  


The subdirectories you will find inside <tt>/branches</tt> are the
The subdirectories you will find inside <tt>/branches</tt> are the application subdirs, like <tt>akregator/</tt>, <tt>amarok/</tt>, <tt>arts/</tt>, <tt>k3b/</tt>, etc. You will also find a <tt>KDE/</tt> subdir, containing the official KDE releases since time immemorial.  
application subdirs, like <tt>akregator/</tt>, <tt>amarok/</tt>,
<tt>arts/</tt>, <tt>k3b/</tt>, etc. You will also find a <tt>KDE/</tt>
subdir, containing the official KDE releases since time immemorial.


One special subdir is found in <tt>/branches</tt>: <tt>work/</tt>. This
One special subdir is found in <tt>/branches</tt>: <tt>work/</tt>. This subdir contains the so-called "work branches", that is, branches containing features being worked on, sometimes highly experimental. Multi-application work branches always are checked in to <tt>/branches/work/</tt>, but single-application branches may be found in each application's subdir. That is a decision left to the developers.  
subdir contains the so-called "work branches", that is, branches containing
features being worked on, sometimes highly experimental. Multi-application
work branches always are checked in to <tt>/branches/work/</tt>, but
single-application branches may be found in each application's subdir. That
is a decision left to the developers.


<br>


== Checking out and updating  ==


== Checking out and updating ==
=== Checking out ===


=== Checking out ===
In order to check out something with Subversion, you use the <tt>checkout</tt> subcommand.  
In order to check out something with Subversion, you use the <tt>checkout</tt> subcommand.


'''WARNING:''' If you checkout trunk/KDE/ or branches/KDE/foo/ you will download complete kde-i18n!
'''WARNING:''' If you checkout trunk/KDE/ or branches/KDE/foo/ you will download complete kde-i18n!  


Suppose you wanted to check out only KDevelop from the KDE repository. You would do:
Suppose you wanted to check out only KDevelop from the KDE repository. You would do:  


CVS command:
CVS command:  
cvs -d :pserver:[email protected]:/home/kde login
cvs -d :pserver:[email protected]:/home/kde checkout kdevelop


Subversion command:
cvs -d&nbsp;:pserver:[email protected]:/home/kde login
cvs -d&nbsp;:pserver:[email protected]:/home/kde checkout kdevelop


Subversion users currently using ssh access should use protocol svn+ssh while  
Subversion command:
subversion users currently using password access should use protocol https  
 
in the following:
Subversion users currently using ssh access should use protocol svn+ssh while subversion users currently using password access should use protocol https in the following:  


  svn checkout --username=&lt;username&gt; &lt;protocol&gt;://svn.kde.org/home/kde/trunk/KDE/kdevelop
  svn checkout --username=&lt;username&gt; &lt;protocol&gt;://svn.kde.org/home/kde/trunk/KDE/kdevelop


=== Updating ===
=== Updating ===


In order to update, you use the <tt>update</tt> subcommand.
In order to update, you use the <tt>update</tt> subcommand.  


This is no different from CVS: you change into your checked out copy (for those new to this whole process, the checked out copy should be in your Home folder) and issue a <tt>svn update</tt> (or, shorter, <tt>svn up</tt>) command.
This is no different from CVS: you change into your checked out copy (for those new to this whole process, the checked out copy should be in your Home folder) and issue a <tt>svn update</tt> (or, shorter, <tt>svn up</tt>) command.  


== Knowing the status of a file ==
== Knowing the status of a file ==
 
To know which local files you had modified, in CVS most people did


To know which local files you had modified, in CVS most people did
  cvs up
  cvs up
and looked at the files with '''M''', this does not work with svn so you have to do
 
and looked at the files with '''M''', this does not work with svn so you have to do  
 
  svn status
  svn status
to know the status of the files.


== Committing to the repository ==
to know the status of the files.
 
== Committing to the repository ==
 
Just like in CVS, committing to the Subversion repository is accomplished with the <tt>commit</tt> or <tt>checkin</tt> (<tt>ci</tt> for short) subcommands.


Just like in CVS, committing to the Subversion repository is accomplished
CVS command:
with the <tt>commit</tt> or <tt>checkin</tt> (<tt>ci</tt> for short) subcommands.


CVS command:
  cvs commit
  cvs commit
  # or
  # or
Line 227: Line 244:
  cvs ci filename.cpp
  cvs ci filename.cpp


Subversion command:
Subversion command:  
 
  svn commit
  svn commit
  # or
  # or
Line 234: Line 252:
  svn ci filename.cpp
  svn ci filename.cpp


This way, <tt>svn</tt> will launch the editor specified in <tt>$SVN_EDITOR</tt> for you
This way, <tt>svn</tt> will launch the editor specified in <tt>$SVN_EDITOR</tt> for you to compose the commit message. If you prefer, you can give <tt>svn</tt> the -m option with your full message:  
to compose the commit message. If you prefer, you can give <tt>svn</tt> the -m
option with your full message:


  svn ci -m "Updating protocol to conform to HTTP/1.1"
  svn ci -m "Updating protocol to conform to HTTP/1.1"


== Ignoring files ==
== Ignoring files ==
 
Subversion stores ignored files per directory. To edit the ignored files of the directory you are currently in, do


Subversion stores ignored files per directory. To edit the ignored
files of the directory you are currently in, do
   svn propedit svn:ignore .
   svn propedit svn:ignore .
that will launch your editor, write there the names of the files you want to
ignore, one file per line. Once you are done, do a commit so the ignored list
file gets updated on the server.


A lot of files were ignored in CVS with help from global ignore list which
that will launch your editor, write there the names of the files you want to ignore, one file per line. Once you are done, do a commit so the ignored list file gets updated on the server.
is not supported yet by SVN. You can wait for svn 1.3 or you need to add the
 
ignore list to the [miscellany] group in your {{path|~/.subversion/config}} (all in
A lot of files were ignored in CVS with help from global ignore list which is not supported yet by SVN. You can wait for svn 1.3 or you need to add the ignore list to the [miscellany] group in your {{path|~/.subversion/config}} (all in one line):  
one line):


  global-ignores = *.o *.lo *.la .*.rej *.rej .*~ *~ .#* #*# .DS_Store *.moc
  global-ignores = *.o *.lo *.la .*.rej *.rej .*~ *~ .#* #*# .DS_Store *.moc
Line 262: Line 274:
  Makefile.rules Makefile.calls autom4te.cache *.kidl
  Makefile.rules Makefile.calls autom4te.cache *.kidl


== Working with multiple revisions and branches ==
== Working with multiple revisions and branches ==


Unlike CVS, Subversion doesn't generate a revision number for each file
Unlike CVS, Subversion doesn't generate a revision number for each file modified. Instead, the full repository is versioned, as a whole. This way, a given revision number represents the state the repository was on a given date. In other words, a revision number is like a timestamp (in fact, the Subversion server uses this fact to search for dates in the repository faster).  
modified. Instead, the full repository is versioned, as a whole. This way, a
given revision number represents the state the repository was on a given date.
In other words, a revision number is like a timestamp (in fact, the Subversion
server uses this fact to search for dates in the repository faster).


So, for instance, when you check out the KDE repository, Subversion will
So, for instance, when you check out the KDE repository, Subversion will tell you the following:  
tell you the following:


  Updated to revision 403821.
  Updated to revision 403821.


This means that the latest revision available at the time of the operation
This means that the latest revision available at the time of the operation was 403821. If you make a modification and commit, Subversion will update the server-side revision and will inform you of it. Like CVS, only the committed files will be updated: you will need run <tt>cvs up</tt> to update the rest of the files.
was 403821. If you make a modification and commit, Subversion will update the
 
server-side revision and will inform you of it. Like CVS, only the committed
If you want to retrieve a specific revision of a file, you can use the <tt>-r</tt> switch. Besides the revision number itself, -r accepts a number of other possibilities:
files will be updated: you will need run <tt>cvs up</tt> to update the rest of the
files.


If you want to retrieve a specific revision of a file, you can use the <tt>-r</tt>
*The revision number: for example, use -r 403819 to retrieve that version  
switch. Besides the revision number itself, -r accepts a number of other
*'''BASE''': the revision you updated to  
possibilities:
*'''COMMITTED''': the revision a file was last modified, before BASE  
 
*'''PREV''': the revision of the previous commit to the file before COMMITTED  
* The revision number: for example, use -r 403819 to retrieve that version
*'''HEAD''': the most recent revision available in the server  
* '''BASE''': the revision you updated to
*'''{ date }''': between curly brackets, you can specify a date for searching the closest revisions
* '''COMMITTED''': the revision a file was last modified, before BASE
* '''PREV''': the revision of the previous commit to the file before COMMITTED
* '''HEAD''': the most recent revision available in the server
* '''{ date }''': between curly brackets, you can specify a date for searching the closest revisions


The following illustrates the evolution of the keywords:
The following illustrates the evolution of the keywords:  


# You run <tt>svn up</tt> to update to the latest available revision. Suppose Subversion tells you it updated to revision 403821. This means that HEAD and BASE are 403821.
#You run <tt>svn up</tt> to update to the latest available revision. Suppose Subversion tells you it updated to revision 403821. This means that HEAD and BASE are 403821.  
# You modify file README and commit it. Suppose Subversion tells you it committed revision 403822. This means HEAD, BASE and COMMITTED are 403822.
#You modify file README and commit it. Suppose Subversion tells you it committed revision 403822. This means HEAD, BASE and COMMITTED are 403822.  
# You modify the file again and commit it. Now PREV is 403822, but HEAD, BASE and COMMITTED are updated to a new value (suppose it's 403823).
#You modify the file again and commit it. Now PREV is 403822, but HEAD, BASE and COMMITTED are updated to a new value (suppose it's 403823).  
# Now someone else modifies the repository, and you update your working copy. If Subversion tells you it updated to 403824, this means now HEAD and BASE are moved to 403824 (but PREV and COMMITTED stay the same)
#Now someone else modifies the repository, and you update your working copy. If Subversion tells you it updated to 403824, this means now HEAD and BASE are moved to 403824 (but PREV and COMMITTED stay the same)  
# If someone modifies the README file now, HEAD is moved. The other keywords stay the same for you, until you update. At this time, we will have HEAD = 403825 (the latest available revision), BASE = 403824 (the revision you last updated to), COMMITTED = 403823 (the revision of the latest change to the file when you last updated) and PREV = 403822 (the revision of the change before COMMITTED)
#If someone modifies the README file now, HEAD is moved. The other keywords stay the same for you, until you update. At this time, we will have HEAD = 403825 (the latest available revision), BASE = 403824 (the revision you last updated to), COMMITTED = 403823 (the revision of the latest change to the file when you last updated) and PREV = 403822 (the revision of the change before COMMITTED)


Those keywords are useful to retrieve logs and diffs for commits to the
Those keywords are useful to retrieve logs and diffs for commits to the repository.  
repository.


If you want to see the difference between your working copy and BASE, you
If you want to see the difference between your working copy and BASE, you can run:  
can run:


  svn diff
  svn diff


This is a very fast operation, since Subversion keeps a local copy of BASE.
This is a very fast operation, since Subversion keeps a local copy of BASE. It doesn't need a network connection to accomplish this operation.  
It doesn't need a network connection to accomplish this operation.


If you want to see the difference between your local copy and the latest
If you want to see the difference between your local copy and the latest available on the server, you will run:  
available on the server, you will run:


  svn diff -r HEAD
  svn diff -r HEAD


If you want to see what has changed in the repository since you've last updated, you can use:
If you want to see what has changed in the repository since you've last updated, you can use:  
 
  svn diff -r BASE:HEAD
  svn diff -r BASE:HEAD


If you want to see the last change to a file before BASE, you can use:
If you want to see the last change to a file before BASE, you can use:  
 
  svn diff -r PREV:BASE
  svn diff -r PREV:BASE
  # or
  # or
  svn diff -r PREV:COMMITTED
  svn diff -r PREV:COMMITTED


That is also valid for the <tt>svn log</tt> command.
That is also valid for the <tt>svn log</tt> command.  
 
== Linking in subdirectories from other places  ==


== Linking in subdirectories from other places ==
It can happen you would like to include a copy of a subdirectory from another place, but just for convenience, not for developing the code in there. Of course it should be updated automatically whenever the original changes. Subversion can help you. You need to edit the property <tt>svn:external</tt> of the directory the subdirectory should be added to. So for the current directory you use


It can happen you would like to include a copy of a subdirectory from another place, but just for convenience, not for developing the code in there. Of course it should be updated automatically whenever the original changes. Subversion can help you. You need to edit the property <tt>svn:external</tt> of the directory the subdirectory should be added to. So for the current directory you use
  svn propedit svn:externals .
  svn propedit svn:externals .
and then enter lines of the form
 
and then enter lines of the form  
 
  libkhalkhi svn://anonsvn.kde.org/home/kde/trunk/playground/pim/khalkhi
  libkhalkhi svn://anonsvn.kde.org/home/kde/trunk/playground/pim/khalkhi
Updating will now fetch <tt>/trunk/playground/pim/khalkhi</tt> into the subdirectoy <tt>libkhalkhi</tt>.


{{warning|Beware that you cannot commit changes you did to the local copy of the external subdirectory, it is just a readonly copy.}}
Updating will now fetch <tt>/trunk/playground/pim/khalkhi</tt> into the subdirectoy <tt>libkhalkhi</tt>.  


You use <tt>svn://anonsvn.kde.org</tt> and not another protocol, because <tt>anonsvn.kde.org</tt> is accessible to everyone. Using <tt>https:</tt> or <tt>svn+ssh:</tt> would only work for users of that protocol. There are still some small disadvantage with <tt>anonsvn.kde.org</tt>: It is not always in synchronization with <tt>svn.kde.org</tt>, so updates in the original branch may take a while to appear on <tt>anonsvn.kde.org</tt>. And some strict firewalls are blocking the <tt>svn:</tt> protocol.
{{warning|Beware that you cannot commit changes you did to the local copy of the external subdirectory, it is just a readonly copy.}}
 
You use <tt>svn://anonsvn.kde.org</tt> and not another protocol, because <tt>anonsvn.kde.org</tt> is accessible to everyone. Using <tt>https:</tt> or <tt>svn+ssh:</tt> would only work for users of that protocol. There are still some small disadvantage with <tt>anonsvn.kde.org</tt>: It is not always in synchronization with <tt>svn.kde.org</tt>, so updates in the original branch may take a while to appear on <tt>anonsvn.kde.org</tt>. And some strict firewalls are blocking the <tt>svn:</tt> protocol.  
 
A special case in KDE 3 is the subdirectory <tt>admin</tt>, containing the KDE 3 build utilities. It is linked in to the top directory in all modules, and maintained in <tt>/branches/KDE/3.5/kde-common</tt>. For <tt>admin</tt> the KDE subversion server is configured to allow readonly access for everyone, so if you see


A special case in KDE 3 is the subdirectory <tt>admin</tt>, containing the KDE 3 build utilities. It is linked in to the top directory in all modules, and maintained in <tt>/branches/KDE/3.5/kde-common</tt>. For <tt>admin</tt> the KDE subversion server is configured to allow readonly access for everyone, so if you see
  admin https://svn.kde.org/home/kde/branches/KDE/3.5/kde-common/admin
  admin https://svn.kde.org/home/kde/branches/KDE/3.5/kde-common/admin
there is no need to change this.


== Further Links ==
there is no need to change this.
 
== Further Links ==


* [[Development/Tools/svnmerge.py|Merge tracking with svnmerge.py]]
*[[Development/Tools/svnmerge.py|Merge tracking with svnmerge.py]]  
* [http://wiki.kde.org/tiki-index.php?page=KDE%20Subversion%20HOWTO The KDE wiki]: More information about subversion in KDE
*[http://wiki.kde.org/tiki-index.php?page=KDE%20Subversion%20HOWTO The KDE wiki]: More information about subversion in KDE

Revision as of 01:14, 8 November 2009


Getting Started/Sources/Using Subversion with KDE


Using Subversion With KDE
Tutorial Series   Getting Started
Previous   None
What's Next   n/a
Further Reading   Contributing/Sending Patches

Abstract

This is a quick KDE-specific introduction for using subversion to access files and software in KDE's repositories. For comprehensive coverage of Subversion we recommend reading the book "Version Control with Subversion".

Getting started

In order to use the KDE Subversion repository, you will need a Subversion client program.


If you only need SVN for checking out the sources (read-only), use the protocol: "svn" , at the server: "anonsvn.kde.org".


So for example, instead of what you see throughout this tutorial, your paths would show a similarity to this: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdevelop


Note: Wherever it mentions "yourname@", http, https, or passwords, you should ignore those and use what is mentioned. None of that stuff is needed for the anonymous server.


If you would like to commit changes to the repository, you will need an SVN account, which is obtainable here: get an SVN Account.




Installing Subversion: instructions on installing the client are not presented here. Refer to your system installation instructions to find out how you can install Subversion. You will need version 1.1 at least. If you are compiling from sources and want to access the KDE repository by https (and not by svn+ssh), you will need SSL and ZLIB support, so you will need the --with-ssl --with-zlib options.

Alternatively, you can install one of the many graphical clients out there(for example, kdesvn, albeit unofficial). This tutorial is intended for people using the svn program only, referring to tasks accomplished with the usual cvs program.

Getting an account: if you have had a CVS account before, it has been migrated to the new Subversion client.

Note
If you have lost your CVS password, there are simple ways to retrieve it. Use cvspwd.c or cvs-unscramble (Perl).


The KDE repository structure

svn.kde.org/home/kde

That's the address of the KDE Subversion repository. The repository is served by HTTPS or SVN+SSH protocol, which means your password is secure against third-party eavesdropping.

The SSL certificate md5 fingerprint for the repositories:

F6BF EDE2 D016 D1B2   4F18 742E 2C8F B7EF

The SSL certificate sha1 fingerprint for the repositories:

e1:e6:41:96:3c:eb:ae:78:e2:73:0d:a2:32:2f:6b:21:13:bf:3d:0f

For people using svn+ssh, here's the fingerprint of the server's RSA key:

86:f3:66:06:20:74:81:d0:1b:b4:2f:25:03:f7:8e:fb

The repository is organised in main directories:

  1. /branches
  2. /tags
  3. /trunk

You can explore the repository structure at http://websvn.kde.org/


The top-level directory /trunk

The /trunk top-level subdirectory is where the main development for KDE occurs. What you will find here is what will become the next KDE release and its associated programs. Here you will also find the www module, which contains webpages for KDE's site and related ones.

/trunk is further subdivided into these sub-directories:

  • KDE/
    KDE itself, what will become the next public release. It contains the following modules:
    • kdelibs - KDE basic libraries, used by all KDE programs
    • kdebase - KDE base programs, like the KDE Control Center, Kicker (the panel) and Konqueror (the web browser)
    • kdeaccessibility - Accessibility files
    • kdeadmin - KDE Administration applications
    • kdeartwork - Images, themes, sounds and other art files
    • kdebindings - Bindings for languages other than C++
    • kdeedu - KDE Educational applications
    • kdegames - KDE Games
    • kdegraphics - KDE Graphical applications
    • kdemultimedia - KDE Multimedia applications
    • kdenetwork - KDE Networking applications
    • kdepim - KDE Personal Information Management applications
    • kdepimlibs - Libraries used by KDE-PIM applications.
    • kdesdk - KDE Software Development Kit applications
    • kdetoys - KDE toy applications
    • kdeutils - KDE General utilities
    • kdevelop - The KDevelop program
    • kdevplatform - The development platform which KDevelop is based on
    • kdewebdev - KDE Web development applications
  • kde-common
Common admin/ directory
  • bugs/
Bugzilla files
  • developer.kde.org/
The content of developer.kde.org
  • extragear/
KDE programs outside the main KDE releases.
  • kdereview/
Temporary home for KDE applications that are believed to have reached release-quality. From here, once all major issues are resolved, applications are moved either to /trunk/KDE/ or to /trunk/extragear/
  • kdesupport/
Supporting applications and libraries for KDE
  • koffice/
    The KDE Office suite, containing the programs:
    • karbon
    • kchart
    • kexi
    • kformula
    • kivio
    • koshell
    • kplato
    • kpresenter
    • krita
    • kspread
    • kugar
    • kword
  • konstruct/
Konstruct, the KDE build program
  • l10n-kde3/
Translations for the "unstable" modules of KDE 3 (extragear, playground)
  • l10n-kde4/
Translations for KDE 4
  • playground/
The KDE playground: applications being developed, but not having yet reached release-quality.
  • qt-copy/
The convenience copy of Trolltech's Qt library, which KDE is based upon. Remember, this is deprecated, you should be using the git repository, kde-qt instead. Qt-copy is at version 4.5, yet trunk requires
  • tests/
khtml, KOffice and ksvg testcases
  • valgrind/
The Valgrind application, which is hosted on the KDE repository, but that is not part of KDE itself. Note that newer versions of Valgrind are developed on their own repository. The KDE Valgrind modules only holds up to Valgrind 2.4.
  • www/
Webpages for the KDE site (and related sites). Write access to this directory is restricted.

The top-level directory /tags

This directory contains the official releases of the programs maintained and developed in the KDE repository. Each individual application has a subdirectory here. Inside it, you will find the release numbers.

For instance, the KDE 3.4.0 code can be found under /tags/KDE/3.4.0/.

The top-level directory /branches

This directory contains the branch versions of the applications after a major release.

Most KDE applications adhere to the philosphy that new features (as well as new user-visible strings) are added only to the next release cycle — the one that lives in /trunk/. However, bugfixes are applied to all applications, even after release.

In order to do that, a branch is created at the moment of the release, indicating the state of the files at that time. Bugfixes are then checked in to those files. Those branches are the ones in /branches/.

For instance, the KDE 3.4.x branch can be found under /branches/KDE/3.4/

The subdirectories you will find inside /branches are the application subdirs, like akregator/, amarok/, arts/, k3b/, etc. You will also find a KDE/ subdir, containing the official KDE releases since time immemorial.

One special subdir is found in /branches: work/. This subdir contains the so-called "work branches", that is, branches containing features being worked on, sometimes highly experimental. Multi-application work branches always are checked in to /branches/work/, but single-application branches may be found in each application's subdir. That is a decision left to the developers.


Checking out and updating

Checking out

In order to check out something with Subversion, you use the checkout subcommand.

WARNING: If you checkout trunk/KDE/ or branches/KDE/foo/ you will download complete kde-i18n!

Suppose you wanted to check out only KDevelop from the KDE repository. You would do:

CVS command:

cvs -d :pserver:[email protected]:/home/kde login
cvs -d :pserver:[email protected]:/home/kde checkout kdevelop

Subversion command:

Subversion users currently using ssh access should use protocol svn+ssh while subversion users currently using password access should use protocol https in the following:

svn checkout --username=<username> <protocol>://svn.kde.org/home/kde/trunk/KDE/kdevelop

Updating

In order to update, you use the update subcommand.

This is no different from CVS: you change into your checked out copy (for those new to this whole process, the checked out copy should be in your Home folder) and issue a svn update (or, shorter, svn up) command.

Knowing the status of a file

To know which local files you had modified, in CVS most people did

cvs up

and looked at the files with M, this does not work with svn so you have to do

svn status

to know the status of the files.

Committing to the repository

Just like in CVS, committing to the Subversion repository is accomplished with the commit or checkin (ci for short) subcommands.

CVS command:

cvs commit
# or
cvs ci
# or
cvs ci filename.cpp

Subversion command:

svn commit
# or
svn ci
# or
svn ci filename.cpp

This way, svn will launch the editor specified in $SVN_EDITOR for you to compose the commit message. If you prefer, you can give svn the -m option with your full message:

svn ci -m "Updating protocol to conform to HTTP/1.1"

Ignoring files

Subversion stores ignored files per directory. To edit the ignored files of the directory you are currently in, do

 svn propedit svn:ignore .

that will launch your editor, write there the names of the files you want to ignore, one file per line. Once you are done, do a commit so the ignored list file gets updated on the server.

A lot of files were ignored in CVS with help from global ignore list which is not supported yet by SVN. You can wait for svn 1.3 or you need to add the ignore list to the [miscellany] group in your ~/.subversion/config (all in one line):

global-ignores = *.o *.lo *.la .*.rej *.rej .*~ *~ .#* #*# .DS_Store *.moc
*.moc.cc *.moc.cpp config.log config.status config.cache *.gmo .deps .libs
SunWS_cache *.lo *.la *.rpo *.la.closure *_la_closure.cpp *_la_closure.cc
*_la_closure.cxx *.all_cc.cc *.all_cpp.cpp *.all_C.C *.all_cxx.cxx
*_meta_unload.cc *_meta_unload.h *_meta_unload.cpp *_meta_unload.C
*_meta_unload.cxx index.cache.bz2 .memdump Makefile.rules.in Makefile.calls.in
Makefile.rules Makefile.calls autom4te.cache *.kidl

Working with multiple revisions and branches

Unlike CVS, Subversion doesn't generate a revision number for each file modified. Instead, the full repository is versioned, as a whole. This way, a given revision number represents the state the repository was on a given date. In other words, a revision number is like a timestamp (in fact, the Subversion server uses this fact to search for dates in the repository faster).

So, for instance, when you check out the KDE repository, Subversion will tell you the following:

Updated to revision 403821.

This means that the latest revision available at the time of the operation was 403821. If you make a modification and commit, Subversion will update the server-side revision and will inform you of it. Like CVS, only the committed files will be updated: you will need run cvs up to update the rest of the files.

If you want to retrieve a specific revision of a file, you can use the -r switch. Besides the revision number itself, -r accepts a number of other possibilities:

  • The revision number: for example, use -r 403819 to retrieve that version
  • BASE: the revision you updated to
  • COMMITTED: the revision a file was last modified, before BASE
  • PREV: the revision of the previous commit to the file before COMMITTED
  • HEAD: the most recent revision available in the server
  • { date }: between curly brackets, you can specify a date for searching the closest revisions

The following illustrates the evolution of the keywords:

  1. You run svn up to update to the latest available revision. Suppose Subversion tells you it updated to revision 403821. This means that HEAD and BASE are 403821.
  2. You modify file README and commit it. Suppose Subversion tells you it committed revision 403822. This means HEAD, BASE and COMMITTED are 403822.
  3. You modify the file again and commit it. Now PREV is 403822, but HEAD, BASE and COMMITTED are updated to a new value (suppose it's 403823).
  4. Now someone else modifies the repository, and you update your working copy. If Subversion tells you it updated to 403824, this means now HEAD and BASE are moved to 403824 (but PREV and COMMITTED stay the same)
  5. If someone modifies the README file now, HEAD is moved. The other keywords stay the same for you, until you update. At this time, we will have HEAD = 403825 (the latest available revision), BASE = 403824 (the revision you last updated to), COMMITTED = 403823 (the revision of the latest change to the file when you last updated) and PREV = 403822 (the revision of the change before COMMITTED)

Those keywords are useful to retrieve logs and diffs for commits to the repository.

If you want to see the difference between your working copy and BASE, you can run:

svn diff

This is a very fast operation, since Subversion keeps a local copy of BASE. It doesn't need a network connection to accomplish this operation.

If you want to see the difference between your local copy and the latest available on the server, you will run:

svn diff -r HEAD

If you want to see what has changed in the repository since you've last updated, you can use:

svn diff -r BASE:HEAD

If you want to see the last change to a file before BASE, you can use:

svn diff -r PREV:BASE
# or
svn diff -r PREV:COMMITTED

That is also valid for the svn log command.

Linking in subdirectories from other places

It can happen you would like to include a copy of a subdirectory from another place, but just for convenience, not for developing the code in there. Of course it should be updated automatically whenever the original changes. Subversion can help you. You need to edit the property svn:external of the directory the subdirectory should be added to. So for the current directory you use

svn propedit svn:externals .

and then enter lines of the form

libkhalkhi svn://anonsvn.kde.org/home/kde/trunk/playground/pim/khalkhi

Updating will now fetch /trunk/playground/pim/khalkhi into the subdirectoy libkhalkhi.

Warning
Beware that you cannot commit changes you did to the local copy of the external subdirectory, it is just a readonly copy.


You use svn://anonsvn.kde.org and not another protocol, because anonsvn.kde.org is accessible to everyone. Using https: or svn+ssh: would only work for users of that protocol. There are still some small disadvantage with anonsvn.kde.org: It is not always in synchronization with svn.kde.org, so updates in the original branch may take a while to appear on anonsvn.kde.org. And some strict firewalls are blocking the svn: protocol.

A special case in KDE 3 is the subdirectory admin, containing the KDE 3 build utilities. It is linked in to the top directory in all modules, and maintained in /branches/KDE/3.5/kde-common. For admin the KDE subversion server is configured to allow readonly access for everyone, so if you see

admin https://svn.kde.org/home/kde/branches/KDE/3.5/kde-common/admin

there is no need to change this.

Further Links