# HG changeset patch # User John Schneiderman # Date 1407463821 18000 # Node ID 6cd1a810f95a25aecbdb630b82d1a4bd5335a3d6 # Parent 3ae2aa2d3ea9ff3c6870619c34a37839ee20a6e4 Placed checks to prevent multiple repository manipulations. IN: - diff -r 3ae2aa2d3ea9 -r 6cd1a810f95a INSTALL --- 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 ============ diff -r 3ae2aa2d3ea9 -r 6cd1a810f95a doc/ChangeLog --- 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 0.2.1 - Fixed issue where the configuration file copy started before it closed. - Fixed issue in Windows locking temporary file and preventing copying. diff -r 3ae2aa2d3ea9 -r 6cd1a810f95a doc/TODO --- 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. diff -r 3ae2aa2d3ea9 -r 6cd1a810f95a src/manager.py --- 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