TweetFollow Us on Twitter

Subversion and XCode

Volume Number: 22 (2006)
Issue Number: 11
Column Tag: Subversion and XCode

Subversion and XCode

Source control management on XCode using Subversion.

by Jose R.C. Cruz

Introduction

Since its release, the MacOS X platform uses CVS as its default source control management (SCM) system. This tool is used for tracking changes made to a project as well as for coordinating efforts and contributions from other users. It is not, however, without its shortcomings. Its inability to handle non-ASCII files and lack of support for binary formats has been a source of frustration for many users. Furthermore, some actions such as reversions and conflict resolutions are less than adequately implemented in CVS.

To address these limitations, the open-source community developed Subversion. This article will serve as a concise introduction to the new tool. It will detail how the tool improves upon CVS as well as provide an overview of its repository structure. It will demonstrate how to use the tool to perform basic SCM operations using the tool as well as how it integrates with the XCode development environment.

Readers are expected to have a working knowledge of XCode as well as the Terminal application. Also, most examples will use bash as the default shell and the CurrencyConverter tutorial as the default project.

The Subversion Tool

The Subversion project

The Subversion (svn) project is an open-source project focused on developing a viable replacement for the CVS tool. It shares the same key developers as CVS, and has its official source repository maintained by CollabNet, Inc.

At the time of this writing, sources for the latest development version (1.3.2) are available as a downloadable tarball file at <subversion.tigris.org>. The latest stable version of the tool (1.3.1) is also available at the same site. The site also provides links to binary installers for various platforms, including OS X. Both binaries and sources are distributed to the public under an Apache/BSD compatible license.

The Subversion Advantage

Subversion provides numerous advantages over CVS. The most notable one is that all project files, regardless of format, are now stored into the repository as binary files. Also, project subdirectories are treated as valid repository items. They can be added, copied, deleted, and renamed like any other project file.

Subversion uses a space-efficient binary diff algorithm to store its repository items. This allows the repository to support multimedia files without causing it to grow to an unwieldy size. Also, all committal transactions are now handled atomically. This ensures that each transaction is allowed to complete without interruption, and protects the repository from corruption caused by simultaneous write accesses.

Finally, Subversion provides a much better complement of subcommands for invoking various SCM transactions. Some subcommands such as add, commit, and export behave similarly to their CVS counterparts. Others such as status, move, and revert are used to perform the same operations that would otherwise require multiple steps or command options on CVS.

Installing Subversion on OS X

The only notable disadvantage of Subversion is that it is not bundled with any versions of MacOS X. This is easily resolved, however, by first downloading the disk image file for version 1.3.1 at <http://metissian.com/projects/macosx/subversion>. Make sure to download only the client version of the tool

Double-click on the .dmg file to mount the image on the Finder. Locate the SubversionClient-1.30.pkg package and double-click on it to start the installation process. Follow the ensuing instructions to complete installation.

The installer package will place the Subversion tools and support files in the /usr/local directory. In order to use the tools, the PATH environment needs to be updated in order for the shell to know their locations. Use your favorite text editor to add the following lines to the hidden .bash_profile file on your home directory.

   PATH=usr/local/man:/usr/local/share:$PATH
   export PATH=/usr/local/bin:/usr/local/lib:$PATH

To test to see if Subversion is correctly installed, type svn --help at the Terminal prompt. Subversion should display its version and a list of all available subcommands.

The Subversion Repository

Creating the repository

Like CVS, you will have to create an empty repository wherein which to store your project archive. First add the following line to the .bash_profile file using your favorite text editor.

export SVNROOT=path_to_your_repository

Then type svnadmin create $SVNROOT at the Terminal prompt to create the repository.

For example, to create Subversion repository to be located at /Users/Shared/SVN, the entry for the .bash_profile file should read as

   export SVNROOT=/Users/Shared/SVN

Then, by typing svnadmin $SVNROOT creates an empty repository at the specified location. If the SVN subdirectory does not exist, the svnadmin tool creates one at the specified path. However, if the enclosing directory /Users/Shared does not exists as well, the tool will instead generate an error.

Unlike CVS, Subversion does not maintain a default repository path. In fact, it allows you to access multiple repositories at a time. The SVNROOT shell variable introduced here helps reduce the amount of typing necessary to invoke a Subversion subcommand.

Figure 1 shows the directory structure of the newly created repository. It consists of a number of configuration files and scripts, as well as eight subdirectories. The only one of interest in this article is the db subdirectory. For a detailed description of the other repository items, read Chapter 5 of the Subversion user manual.

The db subdirectory is where Subversion maintains your project archives. It contains three subdirectories as well as additional support files. Each project archive revision is stored in the revs subdirectory. Properties for each archive are stored in the revprops subdirectory. The transactions subdirectory is used to contain files required by an SCM transaction. Those same files are then removed when that transaction completes itself.

By default, Subversion uses Berkeley DB as the format for its repository database. Interestingly enough, the MacOS X version uses FSFS, also known as The [Versioned] Filesystem, as its database format. This format has the advantage of being platform agnostic and multi-user friendly. It also provides better I/O performance by taking advantage of the underlying native filesystem. Furthermore, it allows the repository to be accessible over a network connection.

For more information on the two repository formats, read Chapter 5 of the user manual.



Figure 1. The SVN Repository.

Adding a project

Before adding a project to the repository, make sure to arrange its directory contents as shown in Figure 2. The trunk subdirectory will contain those files representing the main development line of the project. This is where you will have your images, plists, nibs, source, and header files, as well as the subdirectories used to organize those files. The branches subdirectory is where Subversion stores the branches created for each file. Branches that were unaltered and destroyed are stored in the tags subdirectory.



Figure 2. The recommended SVN project layout.

This directory structure is recommended only if you are maintaining a central repository to store your project archives. If you are maintaining separate repositories for each project, then you may choose not to adopt this structure.

To add a project to the repository, type

   svn import project_directory_name file://$SVNROOT/project_name \
         -m "project_import_message"

at the Terminal prompt. Notice that the repository path is first preceded by the URL token file://. This indicates the repository is located in the same physical machine as the project. If the repository were located over a network, its path would then be preceded by either an http:// or svn:// token. For more information on how to setup a network repository, consult Chapter 6 of the user manual.

For example, to add the CurrencyConverter project to the repository, first navigate to the directory containing the project using the Terminal application. Then type

   svn import CurrencyConverter file://$SVNROOT/CurrencyConverter \
      -m "Adding the Currency Converter tutorial demo"

at the prompt. To check if the project was successfully added to the repository, type

   svnlook tree $SVNROOT

at the prompt. Subversion responds by displaying the tree structure of each archived projects (Listing 1), one of which belongs to CurrencyConverter.

Listing 1. Sample Subversion tree structure.

/
 CurrencyConverter/
  trunk/
   main.m
   ConverterController.h
   Converter.m
   currCnvrt.pbproj/
    aUser.pbxuser
    project.pbxproj
   ConverterController.m
   Converter.h
   English.lproj/
    InfoPlist.strings
    MainMenu.nib/
     objects.nib
     info.nib
     keyedobjects.nib
     classes.nib
    MainMenu~.nib/
     objects.nib
     info.nib
     keyedobjects.nib
     classes.nib
  branches/
  tags/

Now to remove a project from the repository, type

svn delete file://$SVNROOT/project_name -m "reasons_for_removal"

at the Terminal prompt. Subversion will then quietly delete all references to the project from its repository. Also, typing svnlook tree $SVNROOT will show that the project is no longer "available". Since deletion also invokes an immediate committal, make sure to provide an appropriate message for the revision log. Otherwise, Subversion will not process the deletion request.

Unlike in CVS, the svn delete subcommand only removes the latest or head revision of the project. Previous revisions of the project are still present in the repository and are accessible for checkouts. The only way to completely remove the project is to create a replacement repository and restore it from the last backup file created before that project was added.

Backing up the repository

One Subversion feature that was not mentioned earlier is its ability to create repository backups. Equally important, it can create these backups without having to take the entire repository offline.

One way to backup the repository is to type

   svnadmin hotcopy $SVNROOT backup_directory_path

at the Terminal prompt. Subversion will copy the entire repository located at SVNROOT and place it at the specified directory. For example, typing svnadmin hotcopy $SVNROOT /Users/Public/Backup creates the backup copy at /Users/Public/Backup. Make sure the backup directory exists; otherwise, Subversion will generate an error.

Another way to backup the repository is to type

   svnadmin dump $SVNROOT > backup_file

at the Terminal prompt. Here, Subversion stores the entire contents of its repository into backup_file. The format used by the file is portable and platform agnostic, making it a suitable way of moving the repository from one filesystem to another. You can also create incremental backups by typing

   svnadmin dump $SVNROOT --incremental > backup_file

at the prompt. The option --incremental tells Subversion to retrieve only those changes added to the repository since the last complete svnadmin dump. The resulting backup file will be smaller as a result.

Restoring from a backup is equally straightforward. If svnadmin hotcopy is used to create the backup, the same subcommand can be used to do the restore by switching the positions of SVNROOT and the backup directory path as follows

   svnadmin hotcopy backup_directory_path $SVNROOT

Make sure to take the old repository offline and delete it before replacing it with the backup copy.

If you used svnadmin dump to backup the repository, type

   svnadmin load $SVNROOT < backup_file

at the Terminal prompt to restore the repository from backup_file. If incremental backups were made, make sure to restore each backup file in the same order that they were created. For example, if you backed up your repository as follows:

   svnadmin dump $SVNROOT > 20060601.bak
   svnadmin dump $SVNROOT --incremental > 20060610.bak
   svnadmin dump $SVNROOT --incremental > 20060620.bak

you should restore your repository in the following sequence to avoid data corruption.

   svnadmin load $SVNROOT < 20060601.bak
   svnadmin load $SVNROOT < 20060610.bak
   svnadmin load $SVNROOT < 20060620.bak

The Subversion Work Cycle

Figure 3 illustrates a basic Subversion work cycle. Subcommands that are marked in red represent those SCM transactions supported by the XCode environment. The rest should be invoked within the project directory through a Terminal session. They could also be invoked through the XCode Script menu. More on Subversion menu scripts will be discussed later on.



Figure 3. The Subversion work cycle.

Checking out a project

Like CVS, you first have to check out a copy of a project from the repository in order to work on it. To check out a working copy, type

   svn checkout file://$SVNROOT/project_name destination_directory 

at the Terminal prompt. Subversion will list each project file and subdirectory that was checked out, and places them at the specified directory. For example, typing

   svn checkout file://$SVNROOT/CurrencyConverter ~/CurrencyConverter

places the CurrencyConverter project in the home directory.

Interestingly enough, Subversion does not provide the equivalent of a cvs release subcommand. Once you are done with your working copy, the only viable way of releasing it, is to manually delete your copy.

Updating the project

Like CVS, Subversion allows a team of users to work on the same project. If you are part of a team, you should always update your copy of the project on a regular basis. This allows you to catch and resolve any potential conflicts between your changes and theirs.

To update your working copy to the latest revision of the project, type svn update at the Terminal prompt. To update it to a specific revision, type svn update -r revision_number at the prompt.

For example, if John Doe has submitted his revision of the source file, Converter.m, first use the Terminal prompt to navigate to your copy of CurrencyConverter. Then type svn update at the prompt to update your copy of Converter.m to the new revision.

Consequently, if you want to find out which project files have been recently changed, type svn status project_name at the Terminal prompt. Subversion then generates a list of files and subdirectories with their current repository state. To display additional status information, type svn status -v project_name at the prompt.

If Subversion detects any conflicts between your working copy and the project archive, it generates three different files containing the conflicting changes. The .mine file contains those changes you have made on your working copy. The .rold_revision is the revision of that file from the archive before you made your changes. The .rnew_revision is the revision of same file from the archive while you were making your changes. Like in CVS, you manually examine each file and attempt to resolve the conflict manually. After you have resolved the conflict, type svn resolved project_file_name at the Terminal prompt to clear the conflict flag. Otherwise, Subversion will not allow you to commit your changes back into the repository.

For example, if your copy of Converter.m file, checked out at revision 3, conflicts with the latest revision (4) in the archive, Subversion generates the following three files:

   Converter.mine    Converter.r3    Converter.r4 

Use your favorite text editor to manually examine and merge the conflicting changes. Once done, type svn resolved Converter.m at the prompt to clear the conflict flag.

Manipulating project items

Subversion allows you to easily add a new project item, like a file or subdirectory, to the repository archive. Furthermore, if the item happens to be a subdirectory containing additional items, Subversion will also add those items as well.

To add a new item to the repository, type svn add project_item_name at the Terminal prompt. For example, if a CurrencyConverter.icns file has been added to the CurrencyConverter project, type svn add CurrencyConverter.icns to add that file to the repository archive. Also, if the project bundle, CurrrencyConverter.proj, was converted to the new XCode 2.2 format, thus changing its extension to .xcodeproj, type svn add CurrencyConverter.xcodeproj at the prompt. Since a bundle is essentially a specialized subdirectory, Subversion will add the subdirectory, including the three files it contains, to the archive.

Subversion also makes it easier to copy, move, and delete existing project items, and then submit those changes back to the repository archive. To create a copy of an existing file or subdirectory, type svn copy project_item_name new_name at the Terminal prompt. To move (or rename) the file or subdirectory, type svn move project_item_name new_name at the prompt. To delete it, type svn delete project_item_name.

Subversion handles all four requests by first queuing them into its transaction queue. Then, on the next committal transaction, it executes each request in the order they were submitted. In the case of a copy, move or delete transaction, Subversion will perform the operation on the working copy of the project as well.

Committing and discarding changes

As in CVS, committing changes made to the project back into the Subversion repository is a straightforward process. Simply type

   svn commit project_item_path -m "reasons_for_committal" 

at the Terminal prompt. Alternatively, to commit all changes made to the project type

   svn commit project_name -m "reasons_for_committal" 

at the prompt. For example, to commit the changes made to the file, Converter.m, type

   svn commit Converter.m -m "reasons_for_committal" 

To commit all changes made to CurrencyConverter, type

   svn commit CurrencyConverter -m "reasons_for_committal" 

Always provide a brief and concise committal message to ensure an accurate revision history.

Subversion first checks the repository for any committal transactions in progress. If none are present, it locks the repository to prevent future committals from other users. It then processes your committal request and unlocks the repository after a successful or rejected committal. In case your committal transaction fails, avoid further attempts in order to protect repository integrity. Contact your project administrator to resolve the issue.

Discarding changes made to a project item is also equally straightforward. Type svn revert project_item_name at Terminal prompt to revert to the latest revision of the item in the repository. To revert to a specific revision of the same item, type

   svn revert -r revision_number project_item_name

at the prompt.

Exporting the project

Finally, Subversion allows you to export a copy of your project archive for public distribution. Like in CVS, the exported copy does not contain any administrative files, thus preventing it from being accidentally committed back into the repository. Also, Subversion streamlines the process by not requiring a release tag assigned to the project to be exported. Instead, it will export a specified revision of the project archive or, if none is specified, the latest revision of said archive.

To export a copy of the project archive, type

   svn export file://$SVNROOT/project_name export_directory_path 

at the Terminal prompt. To export a specific revision of the archive, type

svn export -r revision_number file://$SVNROOT/project_name \
         export_directory_path

at the prompt. For example, if you want to export the latest revision of CurrencyConverter, type

svn export file://$SVNROOT/CurrencyConverter \
          ~/Projects/CurrencyConverter_GM

to export the project under the name CurrencyConverter_GM and in the Projects subdirectory of your home directory.

It is recommended that you assign a different name to your exported project. However, if you use the same name as the project archive, make sure to export the project to a different directory. This is to avoid the export process from accidentally overwriting your working copy of the archive.

Subversion and XCode

Since both CVS and Subversion share some of the same subcommands, XCode is capable of supporting either one through its SCM menu. However, many of the SCM operations supported by XCode are geared more towards CVS, being the default tool. But, with some work on your part, you can configure XCode to take advantage of many Subversion features.

Enabling Subversion support

To start managing your XCode project using Subversion, add your project to the repository and check out a working copy using the procedures stated earlier. Open the project into XCode and choose Edit Project Settings from the Project menu to display the Project Info panel. Select Subversion from the drop-down list labeled SCM System. Click on the Edit button to change the current Subversion tool path from /usr/local/subversion/bin/svn to /usr/local/bin/svn (Figure 4). If you skip this step, XCode will display an error informing you that it is unable to locate the Subversion tool. Once you have set the correct tool path, click on the Enable SCM checkbox to set it.



Figure 4. Changing the SCM tool path.

There is nothing wrong with the default tool path of /usr/local/subversion/bin/svn if you happen to have installed Subversion at that particular location. However, the current Subversion installer uses /usr/local/bin as its installation directory, hence the procedure. This could change in future distributions so make sure to read the accompanying release notes before installing or upgrading your copy of Subversion.

The Subversion work cycle in XCode

As mentioned earlier, XCode uses the SCM menu to handle the Subversion work cycle. Each menu item performs the selected transaction by invoking the appropriate Subversion subcommand, many of which are shown in Table 1. Most of the subcommands invoked work on the latest revision of the project archive or its items. Those that work on specific revisions will prompt you for the revision number through an input dialog.

Menu Item               Subcommand

SCM Results             svn status   
Add to Repository       svn add   
Resolved                svn resolved   
Commit Changes...       svn commit project_item_name -m message   
Discard Changes         svn revert   
Update To               svn update -r   
Diff With               svn diff -r   
Get Annotations For     svn blame -r   
Commit Entire Project   svn commit project_name -m message   
Update Entire Project   svn update project_name   

Table 1. The SCM menu items and their SVN subcommands.

Other menu items will also generate the Subversion subcommand corresponding to the selected operation. For instance, choosing Rename from the File menu to rename a project file generates an svn move to rename the same file in the repository archive. Choosing Delete from the Edit menu to remove a project file (both references and item), generates an svn delete, thus removing the file from the archive.

The Info panel (Figure 5) can also generate the appropriate Subversion subcommands by clicking one of the four buttons on the panel. Each command uses the currently selected project file or the project bundle as its input argument.

The Update button generates an svn log, which displays the log report for the selected item. The Compare button generates an svn export to temporarily retrieve the item from the archive. It then launches FileMerge and uses it to compare the contents of the exported item with that from the project. The Diff button generates an svn diff showing the differences between the selected item and its archival version. Finally, the Annotate button generates an svn blame, displaying the revision and author history of the selected item.



Figure 5. The SCM view of the Info panel.

Subversion menu scripts

Unfortunately, the built-in SCM support in XCode is limited and certainly not customizable. Future versions of XCode might address this limitation by redesigning its SCM support as a collection of customizable plug-ins. Each SCM plug-in would then correspond to a specific system such as Subversion, and would allow developers to fine-tune each transaction in a fashion similar to key bindings.

Until than happens, the only way to implement customized SCM transactions is through the XCode Script menu. This menu supports scripts that are written in most shell languages such bash, Python, and Perl. It does not, however, supports scripts written entirely in AppleScript nor JavaScript.

All XCode menu scripts are stored in the directory

/Library/Application Support/Apple/Developer Tools-
      /Scripts/10-User Scripts

The scripts are grouped into separate subdirectories, each one corresponding to a category. For instance, the SCM menu scripts featured here are stored in the subdirectory named Subversion.

Listing 2 shows one example of a Subversion menu script. This script first checks the trunk directory of the project for the hidden subdirectory .svn. It then extracts the repository path and project name from the entries file stored in the hidden subdirectory. Afterwards, the script invokes the svnlook tree subcommand and stores the results into the file, svnlook_tree.log. It then uses XCode to display the contents of the log file. A variation of this script is also used to invoke the svnlook history subcommand.

Listing 2. Displaying the repository tree.

#! /bin/bash
#
# Script:       svnlook_tree.sh
# Description:    Display the tree structure of the project in
#             the Subversion repository
#
# -- PB User Script Info --
# %%%{PBXName=Show SVN Tree}%%%
# %%%{PBXInput=None}%%%
# %%%{PBXOutput=SeparateWindow}%%%
#
# update the following environmental variable
export PATH=/usr/local/bin:/usr/local/lib:$PATH
#prepare the following shell variables
SVNTAG="repos="
SVNURL="url="
SVNDIR="build/svn"
SVNLOG="$SVNDIR/svnlook_tree.log"
SVNERR="$SVNDIR/svnlook_tree.err"
#check for the following hidden directory
if [ -d ".svn" ]; 
then
   #retrieve the repository key
   SVNGREP=`grep $SVNTAG .svn/entries`
   
   #retrieve the repository location
   SVNROOT=`echo $SVNGREP | awk -F= '{ print $2 }'`
   SVNROOT=`echo $SVNROOT | awk -F"\"" '{ print $2 }'`
   
   #remove the URL tag
   SVNROOT=`echo $SVNROOT | awk -F"//" '{ print $2 }'`
   
   #retrieve the project key
   SVNGREP=`grep $SVNURL .svn/entries`
   
   #retrieve the project name
   SVNPROJ=`echo $SVNGREP | awk -F= '{ print $2 }'`
   SVNPROJ=`echo $SVNPROJ | awk -F"\"" '{ print $2 }'`
   SVNPROJ=`echo $SVNPROJ | awk -F"/" '{ NOM=NF-1 ; print $NOM }'`
   
   #check for the following directory
   if [ ! -d $SVNDIR ];
   then
      mkdir -p $SVNDIR
   fi
   
   #retrieve the repository key structure
   svnlook tree $SVNROOT $SVNPROJ --show-ids 1> $SVNLOG 2> $SVNERR
   if [ ! -s $SVNERR ];
   then
      rm -Rf $SVNERR
   fi
   
   #construct the full path to the log file
   SVNLOG=`pwd`/$SVNLOG
   SVNLOG="OS X"`echo $SVNLOG`
   SVNLOG=`echo ${SVNLOG//\//:}`
   SVNLOG="\"$SVNLOG\""
   
   #open the file using XCode
   osascript <<-APPLESCRIPT
      tell application "Finder"
          set fileref to get file $SVNLOG as string
          
          tell application "XCode"
             activate
             open file fileref
          end tell
       end tell
      APPLESCRIPT
else
   echo "This project is currently not under SCM by Subversion."
fi

A second example of a Subversion menu script is shown in Listing 3. This script also performs the same checks as the previous one. Afterwards, it queries the user for a backup filename and a location where to store the backup. It then invokes the svnadmin dump subcommand to create the backup file at the specified location. A variation of this script is also used to invoke the svnadmin hotcopy subcommand.

Listing 3. Creating a repository backup file.

#! /bin/bash
#
# Script:       svnadmin_dump.sh
# Description:    Create a backup image of the SVN repository.
#
# -- PB User Script Info --
# %%%{PBXName=Create Backup Image}%%%
# %%%{PBXInput=None}%%%
# %%%{PBXOutput=SeparateWindow}%%%
#
# update the following environmental variable
export PATH=/usr/local/bin:/usr/local/lib:$PATH
#prepare the following shell variables
SVNTAG="repos="    #the repository tag
SVNURL="url="       #the URL tag
SVNOUT=svn`date "+%m%d%y%H%M%S"`.bak    #default output file
SVNMSG="Save the file in:"             #output prompt
#check for the following hidden directory
if [ -d ".svn" ]; 
then
   #prompt the user for the output path
   SVNBAK=`%%%{PBXUtilityScriptsPath}%%%/AskUserForNewFileDialog "$SVNMSG" "$SVNOUT"`
   
   #validate the output path
   SVNCNT=`echo $SVNBAK | awk -F"/" '{ print NF }'`
   if [ "$SVNCNT" -gt "1" ];
   then
      #start the backup process
      #------
      #retrieve the repository key
      SVNGREP=`grep $SVNTAG .svn/entries`
      
      #retrieve the repository location
      SVNROOT=`echo $SVNGREP | awk -F= '{ print $2 }'`
      SVNROOT=`echo $SVNROOT | awk -F"\"" '{ print $2 }'`
         
      #remove the URL tag
      SVNROOT=`echo $SVNROOT | awk -F"//" '{ print $2 }'`
      
      #invoke the svnadmin command
      svnadmin dump $SVNROOT -q > $SVNBAK
   fi
else
   echo "This project is currently not under SCM by Subversion."
fi

Menu scripts, however, do have some inherent problems. Since the Script menu is enabled only when XCode is displaying a project, it makes it unfeasible to create a menu script that will invoke an svn checkout transaction. Also, if a menu script contains a call to one of its built-in utility scripts, specifically those that displays a user-interface, and to the osascript tool as well, XCode hangs consistently whenever it rebuilds its Script menu. Separating those two calls is the only way of avoiding the hang condition.

Concluding Remarks

Subversion is a source-code management system that improves upon the venerable CVS in numerous ways. It supports most of the same subcommands while providing more relevant ones to do other transactions. It also supports binary file formats, provides better handling of project subdirectories, and has backup and restore features.

The XCode development environment integrates rather well with Subversion. Since both uses nearly the same subcommands, XCode was able to use Subversion without any major issues. More advanced Subversion features can be accessed through XCode by providing the appropriate menu scripts.

[Ed. Note - As shown, Subversion is an incredible tool. But note that it's not only for source code! Mac techs will be seeing a lot more Subversion in their future. Also, while the underlying principals are important to understand, if you ever need a quick-and-dirty svn check out, or are just pre-disposed to the GUI, a new graphical Subversion client just shipped for the Mac. ZigZig Software introduced ZigVersion during WWDC 2006 - after Jose wrote this article! Find out more at http://www.zigzig.com]

Bibliography and References

Collins-Sussman, Ben, Brian Fitzpatrick, C. Michael Pilato. Version Control with Subversion. Revision 1337. Copyright 2002, 2003, 2004, 2005. Ben Collins-Sussman BrianW Fitzpatrick C. Michael Pilato.

Wikipedia. Subversion. In Wikipedia, the free encyclopaedia. The Wikipedia Community. 2006 June 7. Online: http://en.wikipedia.org/wiki/Subversion_%28software%29.

Apple Computers. "Appendix A: Using Subversion". XCode 2.2 User Guide. Copyright 2004, 2005. Apple Computers, Inc.

Apple Computers. "Using Scripts to Customise XCode". XCode 2.2 User Guide. Copyright 2004, 2005. Apple Computers, Inc.


JC is a freelance engineering consultant and writer currently residing in North Vancouver, British Columbia. He divides his time between writing technical articles, and teaching origami at the local district's public library. He can be reached at <anarakisware@cashette.com>.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Together 3.6.1 - Store and organize all...
Together helps you organize your Mac, giving you the ability to store, edit and preview your files in a single clean, uncluttered interface. Features Smart storage. With simple drag-and-drop... Read more
Cloud 4.1.1 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more
OmniFocus 2.7.1 - GTD task manager with...
OmniFocus helps you manage your tasks the way that you want, freeing you to focus your attention on the things that matter to you most. Capturing tasks and ideas is always a keyboard shortcut away in... Read more
CleanApp 5.1.1 - Application deinstaller...
CleanApp is an application deinstaller and archiver.... Your hard drive gets fuller day by day, but do you know why? CleanApp 5 provides you with insights how to reclaim disk space. There are... Read more
ForkLift 3.0 Beta 2 - Powerful file mana...
ForkLift is a powerful file manager and ferociously fast FTP client clothed in a clean and versatile UI that offers the combination of absolute simplicity and raw power expected from a well-executed... Read more
Sublime Text 3126 - Sophisticated text e...
Sublime Text is a sophisticated text editor for code, markup, and prose. You'll love the slick user interface, extraordinary features, and amazing performance. Features Goto Anything. Use Goto... Read more
1Password 6.3.3 - Powerful password mana...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
WhatsApp 0.2.1880 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
NeoFinder 6.9.3 - Catalog your external...
NeoFinder (formerly CDFinder) rapidly organizes your data, either on external or internal disks, or any other volumes. It catalogs all your data, so you stay in control of your data archive or disk... Read more
Amadeus Pro 2.3.1 - Multitrack sound rec...
Amadeus Pro lets you use your Mac computer for any audio-related task, such as live audio recording, digitizing tapes and records, converting between a variety of sound formats, etc. Thanks to its... Read more

Paperback: The Game (Games)
Paperback: The Game 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: You are an author trying to finish kitschy paperback novels. Complete Westerns, Science Fiction, Romance or even a Crime... | Read more »
How to Rule With a Firm Hand in My Majes...
My Majesty is a kingdom management sim not unlike August’s magisterial hit, Reigns. It’s essentially a reskin of developer Tigrido’s previous management sim, Dictator. As supreme ruler of the land, you must consult with a number of subjects to... | Read more »
Our 5 Favorite iMessage Sticker Packs
At long last, iMessage joins the ranks of messaging apps the likes of LINE and Whatsapp, adding an impressive collection of stickers. They’re a great way to add a little something extra to your daily conversations. [Read more] | Read more »
How to get past Vulture Island's tr...
Vulture Island is a colorful and quirky mish-mash of platforming and puzzles. It’s creative and fresh, but sometimes the game can throw a curveball at you, leaving you stuck as to how you should progress. These tips will help you explore smoothly... | Read more »
The new Clash of Kings is just for Weste...
If you’ve played the original Clash of Kings, you’ll probably recognise the city building, alliance forging and strategic battles in Clash of Kings: The West. What sets this version apart is that it’s tailor made for a Western audience and the... | Read more »
Frost - Survival card game (Games)
Frost - Survival card game 1.12.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.12.1 (iTunes) Description: *Warning: the game will work on iPhone 5C and above and iPad Pro / 4. Other devices are not supported* | Read more »
How to build and care for your team in D...
Before you hit the trail and become a dog sledding legend, there’s actually a fair bit of prep work to be done. In Dog Sled Saga, you’re not only racing, you’re also building and caring for a team of furry friends. There’s a lot to consider—... | Read more »
How to win every race in Dog Sled Saga
If I had to guess, I’d say Dog Sled Saga is the most adorable racing game on the App Store right now. It’s a dog sled racing sim full of adorable, loyal puppies. Just look at those fluffy little tails wagging. Behind that cute, pixelated facade is... | Read more »
Let the war games commence in Gunship Ba...
Buzz Lightyear famously said, “This isn’t flying, this is falling – with style!” In the case of Gunship Battle: Second War, though, this really is flying - with style! The flight simulator app from Joycity puts you in control of 20 faithfully... | Read more »
How to get a high score in Fired Up
Fired Up is Noodlecake Games’ high score chasing, firefighting adventure. You take control of a wayward firefighter who propels himself up the side of a highrise with blasts of water. Sound silly? It is. It’s also pretty difficult. You can’t... | Read more »

Price Scanner via MacPrices.net

15-inch 2.2GHz Retina MacBook Pro on sale for...
B&H Photo has the 2015 15″ 2.2GHz Retina MacBook Pro (MJLQ2LL/A) on sale for $1799, including free shipping plus NY sales tax only. Amazon also has the 2015 15″ 2.2GHz Retina MacBook Pro (... Read more
Toughbook Celebrates 20 Years of Ruggedized M...
Panasonic System Communications Company of North America, Division of Panasonic Corporation of North America (Panasonic) today celebrates the 20th anniversary of its industry-leading Toughbook mobile... Read more
12-inch 1.1GHz Gray Retina MacBook on sale fo...
B&H Photo has the 2016 12″ 1.1GHz Gray Retina MacBook on sale for $1199.99 including free shipping plus NY sales tax only. Their price is $100 off MSRP. Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more
Save 30% on Camera Guard’s Secure Protection...
To celebrate the release of macOS Sierra, Miami-based security solutions company, ProtectStar has announced a special 30% discount on Camera Guard Professional for Mac 2016. This innovative security... Read more
DVDFab Special Deal – Get a 1-Year Free Licen...
Beijing, China based specialist in the field of DVD, Blu-ray and video backup solutions, Fengtao Software has launched its Autumn Special Deals 2016, giving a 1-year free license of a randomly picked... Read more
21-inch iMacs on sale for up to $120 off MSRP
B&H Photo has 21″ iMacs on sale for up to $120 off MSRP including free shipping plus NY sales tax only: - 21″ 3.1GHz iMac 4K: $1379 $120 off MSRP - 21″ 2.8GHz iMac: $1199.99 $100 off MSRP - 21″ 1... Read more
13-inch 2.7GHz/256GB Retina MacBook Pro on sa...
Amazon.com has the 13″ 2.7GHz/256GB Retina Apple MacBook Pro on sale for $151 off MSRP including free shipping: - 13″ 2.7GHz/256GB Retina MacBook Pro (sku MF840LL/A): $1348 $151 off MSRP Read more
Apple TVs on sale for up to $50 off MSRP
Best Buy has 32GB and 64GB Apple TVs on sale for $40-$50 off MSRP on their online store. Choose free shipping or free local store pickup (if available). Sale prices for online orders only, in-store... Read more
Apple refurbished 13-inch Retina MacBook Pros...
Apple has Certified Refurbished 13″ Retina MacBook Pros available for up to $270 off the cost of new models. An Apple one-year warranty is included with each model, and shipping is free: - 13″ 2.7GHz... Read more

Jobs Board

Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Sr. *Apple* Mac Engineer - Net2Source Inc....
…staffing, training and technology. We have following position open with our client. Sr. Apple Mac Engineer6+ Months CTH Start date : 19th Sept Travelling Job If Read more
*Apple* Retail - Multiple Positions-Norfolk,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Lead *Apple* Solutions Consultant - Apple (...
# Lead Apple Solutions Consultant Job Number: 51829230 Detroit, Michigan, United States Posted: Sep. 19, 2016 Weekly Hours: 40.00 **Job Summary** The Lead ASC is an Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.