changeset 31:6cd1a810f95a

Placed checks to prevent multiple repository manipulations. IN: -
author John Schneiderman <JohnMS@CodeGNU.com>
date Thu, 07 Aug 2014 21:10:21 -0500
parents 3ae2aa2d3ea9
children ba88b8114b98 f2e0f4de13ea
files INSTALL doc/ChangeLog doc/TODO src/manager.py
diffstat 4 files changed, 113 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- a/INSTALL	Thu Aug 07 20:16:24 2014 -0500
+++ b/INSTALL	Thu Aug 07 21:10:21 2014 -0500
@@ -21,11 +21,13 @@
 Needed for compiling
 ====================
 1) Python 2.7+
+2) FileLock from https://github.com/dmfrey/FileLock
 
-How To compile the programme
+How To compile the program
 ============================
-1) setup.py build
-2) setup.py install
+1) Build and install FileLock to site-packages if not already present.
+2) setup.py build
+3) setup.py install
 
 Known Issues
 ============
--- a/doc/ChangeLog	Thu Aug 07 20:16:24 2014 -0500
+++ b/doc/ChangeLog	Thu Aug 07 21:10:21 2014 -0500
@@ -23,6 +23,7 @@
 - Generate default ignore file when creating a new managed repository.
 - Write an ignore file to an existing managed repository.
 - HgWeb configuration now managed cleanly, i.e. no longer a raw read/write.
+- Multiple managers cannot work on the set-up at the same time.
 2014-07-29 John Schneiderman <Licensing _AT_ CodeGNU _DOT_ com> 0.2.1
 - Fixed issue where the configuration file copy started before it closed.
 - Fixed issue in Windows locking temporary file and preventing copying.
--- a/doc/TODO	Thu Aug 07 20:16:24 2014 -0500
+++ b/doc/TODO	Thu Aug 07 21:10:21 2014 -0500
@@ -36,6 +36,5 @@
 - Manager should have an API key per user permission values.
 - Specify from command line where to search for a configuration file.
 - Manager should prevent two repositories from using the same display name.
-- Manager should prevent two administrators from editing the same repository.
 - Manager should list all managed repositories like Display_Name(Storage_Name).
 - Change functions to use exceptions for error handling, except for the command-line module.
--- a/src/manager.py	Thu Aug 07 20:16:24 2014 -0500
+++ b/src/manager.py	Thu Aug 07 21:10:21 2014 -0500
@@ -42,37 +42,41 @@
 	import sys
 	import os
 	import shutil
-
-	print "Adding repository: %s" % repository.StorageName
-	if __doesRepositoryExist(repository):
-		print >>sys.stderr, "The repository '%s' already exists." % repository.StorageName
-		return False
+	import filelock as guard
 
-	# Create the requested repository.
-	if __addRepository(repository):
-		print "Initialised repository directory."
-		if not __create_ignores(repository, ignoreGroup):
+	print "Acquiring manager lock ..."
+	lock = guard.FileLock('HWM')
+	with lock:
+		print "Adding repository: %s" % repository.StorageName
+		if __doesRepositoryExist(repository):
+			print >>sys.stderr, "The repository '%s' already exists." % repository.StorageName
 			return False
-	else:
-		print >>sys.stderr, "Failed to create repository directory."
-		return False
 
-	# Fill out the details of about the repository.
-	if __writeRepositoryDetails(repository):
-		print "Successfully wrote display details."
-	else:
-		print >>sys.stderr, "Failed to write display details."
-		os.chmod(settings.RepositoryPath + os.sep + repository.StorageName + os.sep + '.hg' + os.sep + "hgrc", stat.S_IWRITE)
-		shutil.rmtree(settings.RepositoryPath + os.sep + repository.StorageName)
-		return False
+		# Create the requested repository.
+		if __addRepository(repository):
+			print "Initialised repository directory."
+			if not __create_ignores(repository, ignoreGroup):
+				return False
+		else:
+			print >>sys.stderr, "Failed to create repository directory."
+			return False
 
-	if not register(repository):
-		os.chmod(settings.RepositoryPath + os.sep + repository.StorageName + os.sep + '.hg' + os.sep + "hgrc", stat.S_IWRITE)
-		shutil.rmtree(settings.RepositoryPath + os.sep + repository.StorageName)
-		return False
-	else:
-		print 'Repository added.'
-		return True
+		# Fill out the details of about the repository.
+		if __writeRepositoryDetails(repository):
+			print "Successfully wrote display details."
+		else:
+			print >>sys.stderr, "Failed to write display details."
+			os.chmod(settings.RepositoryPath + os.sep + repository.StorageName + os.sep + '.hg' + os.sep + "hgrc", stat.S_IWRITE)
+			shutil.rmtree(settings.RepositoryPath + os.sep + repository.StorageName)
+			return False
+
+		if __registerRepository(repository):
+			print 'Repository added.'
+			return True
+		else:
+			os.chmod(settings.RepositoryPath + os.sep + repository.StorageName + os.sep + '.hg' + os.sep + "hgrc", stat.S_IWRITE)
+			shutil.rmtree(settings.RepositoryPath + os.sep + repository.StorageName)
+			return False
 
 def register(repository):
 	""" Connects an existing repository to the mercurial web registry.
@@ -87,19 +91,23 @@
 	 @return When the registration is successful gives true, else-wise false.
 	"""
 	import sys
-
-	print "Registering the repository: %s" % repository.StorageName
-	if not __doesRepositoryExist(repository):
-		print >>sys.stderr, "The repository '%s' does not exists." % repository.StorageName
-		return False
+	import filelock as guard
 
-	# Add the new repository to the web registry.
-	if __registerRepository(repository):
-		print "Successfully registered repository."
-		return True
-	else:
-		print >>sys.stderr, "Failed to register repository."
-		return False
+	print "Acquiring manager lock ..."
+	lock = guard.FileLock('HWM')
+	with lock:
+		print "Registering the repository: %s" % repository.StorageName
+		if not __doesRepositoryExist(repository):
+			print >>sys.stderr, "The repository '%s' does not exists." % repository.StorageName
+			return False
+
+		# Add the new repository to the web registry.
+		if __registerRepository(repository):
+			print "Successfully registered repository."
+			return True
+		else:
+			print >>sys.stderr, "Failed to register repository."
+			return False
 
 def modify(newRepository, currentStorageName, ignoreGroup):
 	""" Changes an existing repository in HgWeb.
@@ -118,58 +126,62 @@
 	"""
 	import sys
 	from manrepo import Repository
+	import filelock as guard
 
-	print "Modifying repository: " + currentStorageName
-	oldRepository = Repository(currentStorageName)
+	print "Acquiring manager lock ..."
+	lock = guard.FileLock('HWM')
+	with lock:
+		print "Modifying repository: " + currentStorageName
+		oldRepository = Repository(currentStorageName)
 
-	if not __doesRepositoryExist(oldRepository):
-		print >>sys.stderr, "The repository '%s' was not found." % oldRepository.StorageName
-		return False
+		if not __doesRepositoryExist(oldRepository):
+			print >>sys.stderr, "The repository '%s' was not found." % oldRepository.StorageName
+			return False
+
+		# Remove the current repository from the web registry.
+		if not __unregisterRepository(oldRepository):
+			print >>sys.stderr, "Failed to unregister repository."
+			return False
 
-	# Remove the current repository from the web registry.
-	if not __unregisterRepository(oldRepository):
-		print >>sys.stderr, "Failed to unregister repository."
-		return False
+		# Update renamed repositories
+		if not oldRepository == newRepository:
+			if __renameStorage(oldRepository, newRepository.StorageName):
+				print "Renamed repository %s to %s." % (currentStorageName, newRepository.StorageName)
+			else:
+				print >>sys.stderr, "Failed to rename repository."
+				if __registerRepository(oldRepository):
+					print "Successfully rolled backed action."
+				else:
+					print >>sys.stderr, "Failed to roll back action."
+				return False
 
-	# Update renamed repositories
-	if not oldRepository == newRepository:
-		if __renameStorage(oldRepository, newRepository.StorageName):
-			print "Renamed repository %s to %s." % (currentStorageName, newRepository.StorageName)
+		# Fill out the details of about the new repository.
+		if __writeRepositoryDetails(newRepository):
+			print "Successfully wrote new details."
 		else:
-			print >>sys.stderr, "Failed to rename repository."
+			print >>sys.stderr, "Failed to write new details."
 			if __registerRepository(oldRepository):
 				print "Successfully rolled backed action."
 			else:
 				print >>sys.stderr, "Failed to roll back action."
 			return False
 
-	# Fill out the details of about the new repository.
-	if __writeRepositoryDetails(newRepository):
-		print "Successfully wrote new details."
-	else:
-		print >>sys.stderr, "Failed to write new details."
-		if __registerRepository(oldRepository):
-			print "Successfully rolled backed action."
-		else:
-			print >>sys.stderr, "Failed to roll back action."
-		return False
+		# Update ignore file if requested.
+		if ignoreGroup is not None:
+			if __create_ignores(newRepository, ignoreGroup):
+				print "Successfully modified ignore file."
+			else:
+				print >>sys.stderr, "Failed to modify ignore file."
+				return False
 
-	# Update ignore file if requested.
-	if ignoreGroup is not None:
-		if __create_ignores(newRepository, ignoreGroup):
-			print "Successfully modified ignore file."
+		# Add the new repository to the web registry.
+		if __registerRepository(newRepository):
+			print 'Repository modified.'
+			return True
 		else:
-			print >>sys.stderr, "Failed to modify ignore file."
+			print >>sys.stderr, "Failed to register repository."
 			return False
 
-	# Add the new repository to the web registry.
-	if __registerRepository(newRepository):
-		print 'Repository modified.'
-		return True
-	else:
-		print >>sys.stderr, "Failed to register repository."
-		return False
-
 def delete(repository):
 	""" Removes an existing repository.
 
@@ -184,24 +196,28 @@
 	 @return When the deletion is successful gives true, else-wise false.
 	"""
 	import sys
+	import filelock as guard
 
-	if not __doesRepositoryExist(repository):
-		print >>sys.stderr, "The repository %s was not found." % repository.StorageName
-		return False
+	print "Acquiring manager lock ..."
+	lock = guard.FileLock('HWM')
+	with lock:
+		if not __doesRepositoryExist(repository):
+			print >>sys.stderr, "The repository %s was not found." % repository.StorageName
+			return False
 
-	print "Removing repository: %s" % repository.StorageName
-	if __unregisterRepository(repository):
-		print "Successfully unregistered repository."
-	else:
-		print >>sys.stderr, "Failed to unregister repository."
-		return False
+		print "Removing repository: %s" % repository.StorageName
+		if __unregisterRepository(repository):
+			print "Successfully unregistered repository."
+		else:
+			print >>sys.stderr, "Failed to unregister repository."
+			return False
 
-	if __removeRepository(repository):
-		print "Repository removed."
-		return True
-	else:
-		print >>sys.stderr, "Failed to delete the repository."
-		return False
+		if __removeRepository(repository):
+			print "Repository removed."
+			return True
+		else:
+			print >>sys.stderr, "Failed to delete the repository."
+			return False