[#5308] send source_url and source_path to repo clone events

This refactors a few common lines from the end of each scm
implementation's clone() method into the shared init_as_clone
method.  Reduces duplication and makes the separate source_url
and source_path vars available to pass to the event.
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index ba8df55..9867cf0 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -15,6 +15,7 @@
 import tg
 from paste.deploy.converters import asbool
 from pylons import c
+from pylons import app_globals as g
 import pymongo.errors
 
 from ming import schema as S
@@ -229,6 +230,9 @@
         session(self).flush(self)
         source = source_path if source_path else source_url
         self._impl.clone_from(source)
+        log.info('... %r cloned', self)
+        g.post_event('repo_cloned', source_url, source_path)
+        self.refresh(notify=False)
 
     def log(self, branch='master', offset=0, limit=10):
         return list(self._log(branch, offset, limit))
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index 152b8fb..cc074d8 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -29,8 +29,7 @@
             text='Repository %s/%s created' % (
                 c.project.shortname, c.app.config.options.mount_point))
     except Exception, e:
-        source_url = cloned_from_path or cloned_from_url
-        g.post_event('repo_clone_task_failed', source_url, traceback.format_exc())
+        g.post_event('repo_clone_task_failed', cloned_from_url, cloned_from_path, traceback.format_exc())
 
 @task
 def reclone(*args, **kwargs):
diff --git a/Allura/allura/tests/test_tasks.py b/Allura/allura/tests/test_tasks.py
index dfecdab..bd1bc04 100644
--- a/Allura/allura/tests/test_tasks.py
+++ b/Allura/allura/tests/test_tasks.py
@@ -38,7 +38,8 @@
         repo_tasks.clone(None, None, fake_source_url)
         assert_equal(post_event.call_args[0][0], 'repo_clone_task_failed')
         assert_equal(post_event.call_args[0][1], fake_source_url)
-        # ignore args[2] which is a traceback string
+        assert_equal(post_event.call_args[0][2], None)
+        # ignore args[3] which is a traceback string
 
 
 class TestEventTasks(unittest.TestCase):
diff --git a/ForgeGit/forgegit/model/git_repo.py b/ForgeGit/forgegit/model/git_repo.py
index 2244baa..3501e38 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -110,9 +110,6 @@
             self._repo.status = 'ready'
             session(self._repo).flush(self._repo)
             raise
-        log.info('... %r cloned', self._repo)
-        g.post_event('repo_cloned', source_url)
-        self._repo.refresh(notify=False)
 
     def commit(self, rev):
         '''Return a Commit object.  rev can be _id or a branch/tag name'''
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py b/ForgeGit/forgegit/tests/model/test_repository.py
index e31a82d..a73f07d 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -163,7 +163,6 @@
             shutil.rmtree(dirname)
         repo.init()
         repo._impl.clone_from(repo_path)
-        post_event.assert_any_call('repo_cloned', repo_path)
         assert len(repo.log())
         assert not os.path.exists('/tmp/testgit.git/hooks/update')
         assert not os.path.exists('/tmp/testgit.git/hooks/post-receive-user')
diff --git a/ForgeHg/forgehg/model/hg.py b/ForgeHg/forgehg/model/hg.py
index fc39d42..22d9227 100644
--- a/ForgeHg/forgehg/model/hg.py
+++ b/ForgeHg/forgehg/model/hg.py
@@ -97,9 +97,6 @@
             self._repo.status = 'ready'
             session(self._repo).flush(self._repo)
             raise
-        log.info('... %r cloned', self._repo)
-        g.post_event('repo_cloned', source_url)
-        self._repo.refresh(notify=False)
 
     def commit(self, rev):
         '''Return a Commit object.  rev can be _id or a branch/tag name'''
diff --git a/ForgeHg/forgehg/tests/model/test_repository.py b/ForgeHg/forgehg/tests/model/test_repository.py
index 99eb814..bfb05ca 100644
--- a/ForgeHg/forgehg/tests/model/test_repository.py
+++ b/ForgeHg/forgehg/tests/model/test_repository.py
@@ -158,7 +158,6 @@
             shutil.rmtree(dirname)
         repo.init()
         repo._impl.clone_from(repo_path)
-        post_event.assert_any_call('repo_cloned', repo_path)
         assert len(repo.log())
         assert not os.path.exists('/tmp/testrepo.hg/.hg/external-changegroup')
         assert not os.path.exists('/tmp/testrepo.hg/.hg/nested/nested-file')
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index eca7229..803fbfa 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -186,8 +186,6 @@
                           c.app.config.options['checkout_url'])):
             c.app.config.options['checkout_url'] = ""
         self._setup_special_files(source_url)
-        g.post_event('repo_cloned', source_url)
-        self._repo.refresh(notify=False)
 
     def refresh_heads(self):
         info = self._svn.info2(
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index d4385fc..7d8b826 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -130,7 +130,6 @@
             shutil.rmtree(dirname)
         repo.init()
         repo._impl.clone_from('file://' + repo_path)
-        assert len(repo.log())
         assert os.path.exists('/tmp/testsvn/hooks/pre-revprop-change')
         assert os.access('/tmp/testsvn/hooks/pre-revprop-change', os.X_OK)
         with open('/tmp/testsvn/hooks/pre-revprop-change') as f: c = f.read()
@@ -142,6 +141,10 @@
         with open('/tmp/testsvn/hooks/post-commit') as f: c = f.read()
         self.assertIn('curl -s http://localhost//auth/refresh_repo/p/test/src/\n', c)
         self.assertIn('exec $DIR/post-commit-user "$@"\n', c)
+
+        repo.refresh(notify=False)
+        assert len(repo.log())
+
         shutil.rmtree(dirname)
 
     @mock.patch('forgesvn.model.svn.g.post_event')
@@ -159,8 +162,6 @@
             shutil.rmtree(dirname)
         repo.init()
         repo._impl.clone_from('file://' + repo_path)
-        post_event.assert_any_call('repo_cloned', 'file://' + repo_path)
-        assert len(repo.log())
         assert os.path.exists('/tmp/testsvn/hooks/pre-revprop-change')
         assert os.access('/tmp/testsvn/hooks/pre-revprop-change', os.X_OK)
         with open('/tmp/testsvn/hooks/pre-revprop-change') as f: c = f.read()
@@ -172,6 +173,10 @@
         with open('/tmp/testsvn/hooks/post-commit') as f: c = f.read()
         self.assertIn('curl -s http://localhost//auth/refresh_repo/p/test/src/\n', c)
         self.assertIn('exec $DIR/post-commit-user "$@"\n', c)
+
+        repo.refresh(notify=False)
+        assert len(repo.log())
+
         shutil.rmtree(dirname)
 
     def test_index(self):
@@ -330,7 +335,7 @@
         ThreadLocalORMSession.flush_all()
         ThreadLocalORMSession.close_all()
         self.prefix = tg.config.get('scm.repos.root', '/')
-        
+
 class _TestWithRepo(_Test):
     def setUp(self):
         super(_TestWithRepo, self).setUp()
@@ -383,11 +388,13 @@
             self.repo.url_for_commit('a'*40),
             '/p/test/test1/ci/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/')
 
-    def test_init_as_clone(self):
+    @mock.patch('allura.model.repository.g.post_event')
+    def test_init_as_clone(self, post_event):
         self.repo.init_as_clone('srcpath', 'srcname', 'srcurl')
         assert self.repo.upstream_repo.name == 'srcname'
         assert self.repo.upstream_repo.url == 'srcurl'
         assert self.repo._impl.clone_from.called_with('srcpath')
+        post_event.assert_called_once_with('repo_cloned', 'srcurl', 'srcpath')
 
     @mock.patch.object(M.repo.CommitRunDoc.m, 'get')
     def test_log(self, crd):
@@ -520,6 +527,7 @@
         self.repo2 = M.Repository(name='test2', tool='svn')
         self.repo2._impl = mock.Mock(spec=M.RepositoryImplementation())
         self.repo2._impl.log = lambda *a,**kw:(['foo'], [])
+        self.repo2._impl.all_commit_ids = lambda *a,**kw: []
         self.repo2._impl._repo = self.repo2
         self.repo2.init_as_clone('/p/test/', 'test1', '/p/test/test1/')
         ThreadLocalORMSession.flush_all()