# HG changeset patch # User Marcin Kuzminski # Date 2018-01-22 17:15:51 # Node ID d48fe67d8c3bb783136c071d2d17d28ea81dd69e # Parent 679204a0a5159a6e7bc1d5a1d6dfb06acea6ef85 scm: added push options for Mercurial and Git to allow remote repository sync. diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -669,6 +669,10 @@ class GitRepository(BaseRepository): ref for ref in remote_refs if remote_refs[ref] in commit_ids] self._remote.fetch(url, refs=refs) + def push(self, url): + refs = None + self._remote.sync_push(url, refs=refs) + def set_refs(self, ref_name, commit_id): self._remote.set_refs(ref_name, commit_id) diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -554,6 +554,10 @@ class MercurialRepository(BaseRepository self._remote.pull(url, commit_ids=commit_ids) self._remote.invalidate_vcs_cache() + def push(self, url): + url = self._get_url(url) + self._remote.sync_push(url) + def _local_clone(self, clone_path): """ Create a local clone of the current repo. diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -373,10 +373,10 @@ class ScmModel(BaseModel): self.sa.add(repo) return repo - def pull_changes(self, repo, username): + def pull_changes(self, repo, username, remote_uri=None): dbrepo = self._get_repo(repo) - clone_uri = dbrepo.clone_uri - if not clone_uri: + remote_uri = remote_uri or dbrepo.clone_uri + if not remote_uri: raise Exception("This repository doesn't have a clone uri") repo = dbrepo.scm_instance(cache=False) @@ -388,13 +388,28 @@ class ScmModel(BaseModel): repo_name = dbrepo.repo_name try: # TODO: we need to make sure those operations call proper hooks ! - repo.pull(clone_uri) + repo.pull(remote_uri) self.mark_for_invalidation(repo_name) except Exception: log.error(traceback.format_exc()) raise + def push_changes(self, repo, username, remote_uri=None): + dbrepo = self._get_repo(repo) + remote_uri = remote_uri or dbrepo.clone_uri + if not remote_uri: + raise Exception("This repository doesn't have a clone uri") + + repo = dbrepo.scm_instance(cache=False) + repo.config.clear_section('hooks') + + try: + repo.push(remote_uri) + except Exception: + log.error(traceback.format_exc()) + raise + def commit_change(self, repo, repo_name, commit, user, author, message, content, f_path): """