You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2012/09/26 18:19:46 UTC
[6/9] git commit: [#2809] Copy existing hg hooks when cloning a local
repo
[#2809] Copy existing hg hooks when cloning a local repo
Signed-off-by: Cory Johns <jo...@geek.net>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/4f86a7ff
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/4f86a7ff
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/4f86a7ff
Branch: refs/heads/master
Commit: 4f86a7ffef9cda52e854a4e94b22c82f9508ccfb
Parents: 1bbfd45
Author: Cory Johns <jo...@geek.net>
Authored: Fri Sep 14 17:20:27 2012 +0000
Committer: Dave Brondsema <db...@geek.net>
Committed: Wed Sep 26 16:18:56 2012 +0000
----------------------------------------------------------------------
ForgeHg/forgehg/model/hg.py | 36 ++++++++++++---
.../data/testrepo.hg/.hg/external-changegroup | 3 +
ForgeHg/forgehg/tests/data/testrepo.hg/.hg/hgrc | 8 +++
.../tests/data/testrepo.hg/.hg/nested/nested-file | 1 +
ForgeHg/forgehg/tests/model/test_repository.py | 21 +++++++++
5 files changed, 63 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4f86a7ff/ForgeHg/forgehg/model/hg.py
----------------------------------------------------------------------
diff --git a/ForgeHg/forgehg/model/hg.py b/ForgeHg/forgehg/model/hg.py
index 229bff0..9d28377 100644
--- a/ForgeHg/forgehg/model/hg.py
+++ b/ForgeHg/forgehg/model/hg.py
@@ -85,7 +85,7 @@ class HgImplementation(M.RepositoryImplementation):
self._repo.full_fs_path.encode('utf-8'),
update=False)
self.__dict__['_hg'] = repo
- self._setup_special_files()
+ self._setup_special_files(source_url)
except:
self._repo.status = 'raise'
session(self._repo).flush(self._repo)
@@ -250,20 +250,44 @@ class HgImplementation(M.RepositoryImplementation):
fctx = self._hg[blob.commit._id][h.really_unicode(blob.path()).encode('utf-8')[1:]]
return fctx.size()
+ def _copy_hooks(self, source_path):
+ '''Copy existing hooks if source path is given and exists.'''
+ if source_path is None or not os.path.exists(source_path):
+ return
+ hgrc = os.path.join(self._repo.fs_path, self._repo.name, '.hg', 'hgrc')
+ try:
+ os.remove(hgrc)
+ except OSError as e:
+ if os.path.exists(hgrc):
+ raise
+ for name in os.listdir(os.path.join(source_path, '.hg')):
+ source = os.path.join(source_path, '.hg', name)
+ target = os.path.join(
+ self._repo.full_fs_path, '.hg', os.path.basename(source))
+ if os.path.exists(target):
+ # skip existing files, presumably internal
+ # hg files that would be the same anyway
+ continue
+ if os.path.isdir(source):
+ shutil.copytree(source, target)
+ else:
+ shutil.copy2(source, target)
+
def _setup_hooks(self, source_path=None):
'Set up the hg changegroup hook'
+ self._copy_hooks(source_path)
+ hgrc = os.path.join(self._repo.fs_path, self._repo.name, '.hg', 'hgrc')
cp = ConfigParser()
- fn = os.path.join(self._repo.fs_path, self._repo.name, '.hg', 'hgrc')
- cp.read(fn)
+ cp.read(hgrc)
if not cp.has_section('hooks'):
cp.add_section('hooks')
url = (tg.config.get('base_url', 'http://localhost:8080')
+ '/auth/refresh_repo' + self._repo.url())
cp.set('hooks','; = [the next line is required for site integration, do not remove/modify]', '')
- cp.set('hooks','changegroup','curl -s %s' % url)
- with open(fn, 'w') as fp:
+ cp.set('hooks','changegroup.sourceforge','curl -s %s' % url)
+ with open(hgrc, 'w') as fp:
cp.write(fp)
- os.chmod(fn, 0755)
+ os.chmod(hgrc, 0755)
def _tree_from_changectx(self, changectx):
'''Build a fake git-like tree from a changectx and its manifest'''
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4f86a7ff/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/external-changegroup
----------------------------------------------------------------------
diff --git a/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/external-changegroup b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/external-changegroup
new file mode 100755
index 0000000..1035ab8
--- /dev/null
+++ b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/external-changegroup
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo external-changegroup
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4f86a7ff/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/hgrc
----------------------------------------------------------------------
diff --git a/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/hgrc b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/hgrc
new file mode 100644
index 0000000..53e1ac4
--- /dev/null
+++ b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/hgrc
@@ -0,0 +1,8 @@
+[other]
+
+custom = custom value
+
+[hooks]
+
+changegroup.external = .hg/external-changegroup
+commit = python:hgext.notify.hook
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4f86a7ff/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/nested/nested-file
----------------------------------------------------------------------
diff --git a/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/nested/nested-file b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/nested/nested-file
new file mode 100755
index 0000000..f1ef19d
--- /dev/null
+++ b/ForgeHg/forgehg/tests/data/testrepo.hg/.hg/nested/nested-file
@@ -0,0 +1 @@
+nested-file
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4f86a7ff/ForgeHg/forgehg/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeHg/forgehg/tests/model/test_repository.py b/ForgeHg/forgehg/tests/model/test_repository.py
index 5c1dc71..e0e2ebf 100644
--- a/ForgeHg/forgehg/tests/model/test_repository.py
+++ b/ForgeHg/forgehg/tests/model/test_repository.py
@@ -2,6 +2,7 @@ import os
import shutil
import unittest
import pkg_resources
+from ConfigParser import ConfigParser
import mock
from ming.base import Object
@@ -129,6 +130,26 @@ class TestHgRepo(unittest.TestCase, RepoImplTestBase):
repo.init()
repo._impl.clone_from(repo_path)
assert len(repo.log())
+ assert os.path.exists('/tmp/testrepo.hg/.hg/external-changegroup')
+ assert os.access('/tmp/testrepo.hg/.hg/external-changegroup', os.X_OK)
+ with open('/tmp/testrepo.hg/.hg/external-changegroup') as f: c = f.read()
+ self.assertEqual(c,
+ '#!/bin/bash\n'
+ '\n'
+ 'echo external-changegroup\n')
+ assert os.path.exists('/tmp/testrepo.hg/.hg/nested/nested-file')
+ assert os.access('/tmp/testrepo.hg/.hg/nested/nested-file', os.X_OK)
+ with open('/tmp/testrepo.hg/.hg/nested/nested-file') as f: c = f.read()
+ self.assertEqual(c, 'nested-file\n')
+ assert os.path.exists('/tmp/testrepo.hg/.hg/hgrc')
+ cp = ConfigParser()
+ cp.read('/tmp/testrepo.hg/.hg/hgrc')
+ assert cp.has_section('other')
+ self.assertEquals(cp.get('other', 'custom'), 'custom value')
+ assert cp.has_section('hooks')
+ self.assertEquals(cp.get('hooks', 'changegroup.sourceforge'), 'curl -s http://localhost//auth/refresh_repo/p/test/src-hg/')
+ self.assertEquals(cp.get('hooks', 'changegroup.external'), '.hg/external-changegroup')
+ self.assertEquals(cp.get('hooks', 'commit'), 'python:hgext.notify.hook')
shutil.rmtree(dirname)
def test_index(self):