From b84ae0fc40cdbd5b7062c3dff8f649cc0561268c Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Fri, 17 Dec 2010 17:12:31 -0600 Subject: Svn2: Native svn plugin --- src/lib/Server/Plugins/Svn2.py | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/lib/Server/Plugins/Svn2.py (limited to 'src/lib/Server/Plugins') diff --git a/src/lib/Server/Plugins/Svn2.py b/src/lib/Server/Plugins/Svn2.py new file mode 100644 index 000000000..89b36b89f --- /dev/null +++ b/src/lib/Server/Plugins/Svn2.py @@ -0,0 +1,71 @@ +import os +try: + import pysvn + missing = False +except: + missing = True +import Bcfg2.Server.Plugin + +# FIXME +REPOS_URL = 'file:///space/svn/admin' + +class Svn2(Bcfg2.Server.Plugin.Plugin, + Bcfg2.Server.Plugin.Version): + """Svn is a version plugin for dealing with Bcfg2 repos.""" + name = 'Svn2' + __version__ = '$Id$' + __author__ = 'bcfg-dev@mcs.anl.gov' + + conflicts = ['Svn'] + experimental = True + __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['Update'] + + def __init__(self, core, datastore): + Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) + + if missing: + self.logger.error("Svn2: Missing PySvn") + raise Bcfg2.Server.Plugin.PluginInitError + + self.client = pysvn.Client() + + self.core = core + self.datastore = datastore + self.svn_root = REPOS_URL + self.revision = None + + # Read revision from bcfg2 repo + revision = self.get_revision() + if not self.revision: + raise Bcfg2.Server.Plugin.PluginInitError + + self.logger.debug("Initialized svn plugin with svn root %s at revision %s" \ + % (self.svn_root, revision)) + + def get_revision(self): + """Read svn revision information for the Bcfg2 repository.""" + try: + info = self.client.info(self.datastore) + self.revision = info.revision + return str(self.revision.number) + except: + self.logger.error("Svn2: Failed to get revision", exc_info=1) + self.revision = None + return str(-1) + + def Update(self): + '''NatvieSvn.Update() => True|False\nUpdate svn working copy\n''' + try: + old_revision = self.revision.number + self.revision = self.client.update(self.datastore, recurse=True)[0] + except: + self.logger.error("Svn2: Failed to update server repository", exc_info=1) + return False + + if old_revision == self.revision.number: + self.logger.debug("repository is current") + else: + self.logger.info("Updated %s from revision %s to %s" % \ + (self.datastore, old_revision, self.revision.number)) + return True + -- cgit v1.2.3-1-g7c22 From adbc58cc37668667e626ff7985fa401dc67edf91 Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Fri, 17 Dec 2010 17:26:27 -0600 Subject: Svn2: Add commit support --- src/lib/Server/Plugins/Svn2.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src/lib/Server/Plugins') diff --git a/src/lib/Server/Plugins/Svn2.py b/src/lib/Server/Plugins/Svn2.py index 89b36b89f..d0d7712f5 100644 --- a/src/lib/Server/Plugins/Svn2.py +++ b/src/lib/Server/Plugins/Svn2.py @@ -18,7 +18,7 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, conflicts = ['Svn'] experimental = True - __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['Update'] + __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['Update','Commit'] def __init__(self, core, datastore): Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) @@ -53,8 +53,18 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, self.revision = None return str(-1) + def commit_changes(self): + """Commit changes into the repository""" + try: + self.revision = self.client.checkin([self.datastore], 'Svn2: autocommit', + recurse=True) + self.revision = self.client.update(self.datastore, recurse=True)[0] + self.logger.info("Svn2: Commited changes. At %s" % self.revision.number) + except: + self.logger.error("Svn2: Failed to commit changes", exc_info=1) + def Update(self): - '''NatvieSvn.Update() => True|False\nUpdate svn working copy\n''' + '''Svn2.Update() => True|False\nUpdate svn working copy\n''' try: old_revision = self.revision.number self.revision = self.client.update(self.datastore, recurse=True)[0] @@ -69,3 +79,12 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, (self.datastore, old_revision, self.revision.number)) return True + def Commit(self): + """Svn2.Commit() => True|False\nCommit svn repository\n""" + try: + self.commit_changes() + return True + except: + return False + + -- cgit v1.2.3-1-g7c22 From dcdfd3684115d11b21f9985754e38c6dc91006fa Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Sat, 18 Dec 2010 07:41:51 -0600 Subject: Plugin.Version: define parameters for commit_data --- src/lib/Server/Plugins/Svn2.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/lib/Server/Plugins') diff --git a/src/lib/Server/Plugins/Svn2.py b/src/lib/Server/Plugins/Svn2.py index d0d7712f5..5af0655e9 100644 --- a/src/lib/Server/Plugins/Svn2.py +++ b/src/lib/Server/Plugins/Svn2.py @@ -53,10 +53,12 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, self.revision = None return str(-1) - def commit_changes(self): + def commit_data(self, file_list, comment=None): """Commit changes into the repository""" + if not comment: + comment = 'Svn2: autocommit' try: - self.revision = self.client.checkin([self.datastore], 'Svn2: autocommit', + self.revision = self.client.checkin([self.datastore], comment, recurse=True) self.revision = self.client.update(self.datastore, recurse=True)[0] self.logger.info("Svn2: Commited changes. At %s" % self.revision.number) @@ -82,7 +84,7 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, def Commit(self): """Svn2.Commit() => True|False\nCommit svn repository\n""" try: - self.commit_changes() + self.commit_changes([]) return True except: return False -- cgit v1.2.3-1-g7c22 From 122af6dcc0c556ebf49d32daa4235b5fc390bc40 Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Sat, 18 Dec 2010 08:24:38 -0600 Subject: Svn2: Remove hardcoded svn root path --- src/lib/Server/Plugins/Svn2.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/lib/Server/Plugins') diff --git a/src/lib/Server/Plugins/Svn2.py b/src/lib/Server/Plugins/Svn2.py index 5af0655e9..6c04d528a 100644 --- a/src/lib/Server/Plugins/Svn2.py +++ b/src/lib/Server/Plugins/Svn2.py @@ -6,9 +6,6 @@ except: missing = True import Bcfg2.Server.Plugin -# FIXME -REPOS_URL = 'file:///space/svn/admin' - class Svn2(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.Version): """Svn is a version plugin for dealing with Bcfg2 repos.""" @@ -31,7 +28,7 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, self.core = core self.datastore = datastore - self.svn_root = REPOS_URL + self.svn_root = None self.revision = None # Read revision from bcfg2 repo @@ -47,6 +44,7 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, try: info = self.client.info(self.datastore) self.revision = info.revision + self.svn_root = info.url return str(self.revision.number) except: self.logger.error("Svn2: Failed to get revision", exc_info=1) -- cgit v1.2.3-1-g7c22 From 09c0c0b30dc9b89c3023a1df8fc85c6e70345512 Mon Sep 17 00:00:00 2001 From: Tim Laszlo Date: Sat, 18 Dec 2010 08:44:04 -0600 Subject: Svn2: Add files explicitly listed which arent under control --- src/lib/Server/Plugins/Svn2.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/lib/Server/Plugins') diff --git a/src/lib/Server/Plugins/Svn2.py b/src/lib/Server/Plugins/Svn2.py index 6c04d528a..875e9e6a6 100644 --- a/src/lib/Server/Plugins/Svn2.py +++ b/src/lib/Server/Plugins/Svn2.py @@ -55,6 +55,18 @@ class Svn2(Bcfg2.Server.Plugin.Plugin, """Commit changes into the repository""" if not comment: comment = 'Svn2: autocommit' + + # First try to update + if not self.Update(): + self.logger.error("Failed to update svn repository, refusing to commit changes") + return + + #FIXME - look for conflicts? + + for file in file_list: + stat = self.client.status(file) + self.client.add([f.path for f in stat \ + if f.text_status == pysvn.wc_status_kind.unversioned]) try: self.revision = self.client.checkin([self.datastore], comment, recurse=True) -- cgit v1.2.3-1-g7c22