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):