[Be-devel] [MERGE] support for monotone
Richard Levitte
richard at levitte.org
Fri May 23 22:01:28 BST 2008
Hello,
I've just implemented support for monotone for use with BE and hope
this will be useful to others as well.
Cheers,
Richard
--
Richard Levitte richard at levitte.org
http://richard.levitte.org/
"When I became a man I put away childish things, including
the fear of childishness and the desire to be very grown up."
-- C.S. Lewis
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: richard at levitte.org-20080523205254-z2c1y48dtrgjj9er
# target_branch: http://bzr.bugseverywhere.org/be/
# testament_sha1: 0ee52a8cab027607adcd0dc20a4f9d92352c7988
# timestamp: 2008-05-23 22:59:37 +0200
# base_revision_id: cjb at laptop.org-20080516192559-kjymn0ynuj0ri70h
#
# Begin patch
=== modified file 'libbe/bugdir.py'
--- libbe/bugdir.py 2008-05-16 18:43:02 +0000
+++ libbe/bugdir.py 2008-05-23 20:52:54 +0000
@@ -141,7 +141,7 @@
except NoSuchFile:
self.settings = {"rcs_name": "None"}
- rcs_name = setting_property("rcs_name", ("None", "bzr", "git", "Arch", "hg"))
+ rcs_name = setting_property("rcs_name", ("None", "bzr", "git", "Arch", "hg", "mtn"))
_rcs = None
target = setting_property("target")
=== added file 'libbe/mtn.py'
--- libbe/mtn.py 1970-01-01 00:00:00 +0000
+++ libbe/mtn.py 2008-05-23 20:52:29 +0000
@@ -0,0 +1,132 @@
+# Copyright (C) 2008 Richard Levitte <richard at levitte.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+import os
+import sys
+import tempfile
+
+import config
+from rcs import invoke, CommandError
+
+######################################################################
+# Helper functions
+
+def mtn_root(path):
+# In a close future, this is how we do it:
+# return invoke_client("automate", "get_workspace_root", directory=path)[1].rstrip('\r')
+ path = os.path.realpath(path)
+ old_path = None
+ while True:
+ if os.path.exists(os.path.join(path, "_MTN")):
+ return path
+ if path == old_path:
+ return None
+ old_path = path
+ path = os.path.dirname(path)
+ return None
+
+def make_path_relative(path, base_dir=os.getcwd()):
+ real_path = os.path.realpath(path)
+ if base_dir == real_path[:len(base_dir)]:
+ return real_path[len(base_dir)+1:]
+ else:
+ return path
+
+def invoke_client(*args, **kwargs):
+ directory = kwargs['directory']
+ expect = kwargs.get('expect', (0,))
+ cl_args = ["mtn"]
+ cl_args.extend(args)
+ status,output,error = invoke(cl_args, expect, cwd=directory)
+ return status, output
+
+def export(revision_id, directory, revision_dir):
+ invoke_client("checkout", "--revision", str(revision_id), revision_dir,
+ directory=directory)
+ bookkeeping_directory = os.path.join(revision_dir, "_MTN")
+ if os.path.exists(bookkeeping_directory):
+ invoke(["rm", "-rf", bookkeeping_directory], (0,), cwd=directory)
+
+def find_or_make_export(revision_id, directory):
+ home = os.path.expanduser("~")
+ revision_root = os.path.join(home, ".be_revs")
+ if not os.path.exists(revision_root):
+ os.mkdir(revision_root)
+ revision_dir = os.path.join(revision_root, revision_id)
+ if not os.path.exists(revision_dir):
+ export(revision_id, directory, revision_dir)
+ return revision_dir
+
+def unlink(path):
+ try:
+ os.unlink(path)
+ delete_id(path)
+ except OSError, e:
+ if e.errno != 2:
+ raise
+
+######################################################################
+# These are functions called from bugdir.py, rcs.py or beweb
+
+def add_id(filename, paranoid=False):
+ filename = make_path_relative(filename)
+ invoke_client("add", filename, directory='.')
+
+def delete_id(filename):
+ filename = make_path_relative(filename)
+ invoke_client("rm", filename, directory='.')
+
+def mkdir(path, paranoid=False):
+ path = make_path_relative(path)
+ invoke_client("mkdir", path, directory='.')
+
+def set_file_contents(path, contents):
+ add = not os.path.exists(path)
+ file(path, "wb").write(contents)
+ if add:
+ add_id(path)
+
+def path_in_reference(bug_dir, spec):
+ spec = spec or 'h:'
+ rel_bug_dir = make_path_relative(bug_dir, mtn_root(bug_dir))
+ export_root = find_or_make_export(spec, directory=bug_dir)
+ return os.path.join(export_root, rel_bug_dir)
+
+
+
+def detect(path):
+ """Detect whether a directory is revision-controlled using Monotone"""
+ path = mtn_root(path)
+ return path != None
+
+def precommit(directory):
+ pass
+
+def commit(directory, summary, body=None):
+ if body is not None:
+ summary += '\n' + body
+ descriptor, filename = tempfile.mkstemp()
+ try:
+ temp_file = os.fdopen(descriptor, 'wb')
+ temp_file.write(summary)
+ temp_file.close()
+ invoke_client('commit', '--message-file', filename, directory=directory)
+ finally:
+ os.unlink(filename)
+
+def postcommit(directory):
+ pass
+
+name = "mtn"
=== modified file 'libbe/rcs.py'
--- libbe/rcs.py 2008-05-16 18:43:02 +0000
+++ libbe/rcs.py 2008-05-23 20:52:54 +0000
@@ -31,6 +31,9 @@
elif rcs_name == "git":
import git
return git
+ elif rcs_name == "mtn":
+ import mtn
+ return mtn
elif rcs_name == "None":
import no_rcs
return no_rcs
@@ -41,6 +44,7 @@
import bzr
import hg
import git
+ import mtn
if arch.detect(dir):
return arch
elif bzr.detect(dir):
@@ -49,6 +53,8 @@
return hg
elif git.detect(dir):
return git
+ elif mtn.detect(dir):
+ return mtn
import no_rcs
return no_rcs
# Begin bundle
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
More information about the Be-devel
mailing list