Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SVN lock a directory

Sorry if this is a duplicate, I didn’t find the right answer still..

How do you lock a svn directory from command line? I need to lock a branch from checkins

Edit:
All of these answers I've found require the person to access the svn server. Thats not an option for me. I work in a company where the source control machine is literally locked in a vault. Gainning access to change auth rules is a process I can't work out ATM.

like image 536
Quintin Par Avatar asked Mar 20 '11 04:03

Quintin Par


People also ask

What does svn lock do?

svn lock — Lock working copy paths or URLs in the repository so that no other user can commit changes to them.

Does svn checkout lock files?

How Locking Works in Subversion. By default, nothing is locked and anyone who has commit access can commit changes to any file at any time. Others will update their working copies periodically and changes in the repository will be merged with local changes.

Can I move svn folder to another location?

Moving files and folders select the files or directories you want to move. right drag them to the new location inside the working copy. release the right mouse button. in the popup menu select Context Menu → SVN Move versioned files here.


2 Answers

You can't lock a directory. You can create authorization rules that will prohibit write access to directories. This is typically how this type of thing is done. You could also use a pre-commit hook but I think Subversion's authz is best. Here is a link:

http://svnbook.red-bean.com/nightly/en/svn.serverconfig.pathbasedauthz.html

like image 145
Jeremy Whitlock Avatar answered Oct 02 '22 14:10

Jeremy Whitlock


I recently solved this by a solution inspired by http://www.noah.org/engineering/olden/svn_directory_lock.html

The particular python script in that post is overkill, but I put the following in the pre-commit hook for my repsoitory:

#!/bin/sh

err() { echo ${1+"$@"} 1>&2; } # stderr is sent to user

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook

# Make sure there is a log message.
#
$SVNLOOK log -t "$TXN" "$REPOS" | grep -q "[a-zA-Z0-9]" 
if [ $? -eq 1 ]
then
  err "ERROR: Must enter a log message for this commit!"
  exit 1
fi

# Usage: locked_dir dir [transaction_id]
locked_dir()
{
  if [ -z "$2" ]; then _tid=""; else _tid="-t $2"; fi
  $SVNLOOK propget $_tid "$REPOS" lock "$1" >/dev/null 2>&1
  if [ $? -eq 0 ]; then echo true; else echo false; fi
}

for d in $($SVNLOOK dirs-changed -t "$TXN" "$REPOS")
do
  locked_before=$(locked_dir $d)
  locked_tx=$(locked_dir $d "$TXN")

  if [ $locked_before = $locked_tx -a $locked_tx = true  ]
  then
    err "ERROR: Directory $d is locked. Delete lock before you commit."
    exit 1
  fi
done

# All checks passed, so allow the commit.
exit 0

So now, you can simply use the "svn propset" and commit to create a "lock" property for a directory that you want to lock.

like image 25
Kayvan Sylvan Avatar answered Oct 02 '22 14:10

Kayvan Sylvan