def _herd(self, remote, ref, **kwargs): """Herd ref .. py:function:: _herd(remote, ref, depth=0, fetch=True, rebase=False) :param str remote: Remote name :param str ref: Git ref Keyword Args: depth (int): Git clone depth. 0 indicates full clone, otherwise must be a positive integer fetch (bool): Whether to fetch rebase (bool): Whether to use rebase instead of pulling latest changes """ depth = kwargs.get('depth', 0) fetch = kwargs.get('fetch', True) rebase = kwargs.get('rebase', False) if ref_type(ref) == 'tag': self.fetch(remote, depth=depth, ref=ref) self._checkout_tag(truncate_ref(ref)) return if ref_type(ref) == 'sha': self.fetch(remote, depth=depth, ref=ref) self._checkout_sha(ref) return branch = truncate_ref(ref) if not self.existing_local_branch(branch): self._create_branch_local_tracking(branch, remote, depth=depth, fetch=fetch) return self._herd_existing_local(remote, branch, depth=depth, rebase=rebase)
def sync(self, fork_remote, rebase=False): """Sync fork with upstream remote .. py:function:: sync(fork_remote, rebase=False) :param str fork_remote: Fork remote name :param Optional[bool] rebase: Whether to use rebase instead of pulling latest changes. """ self._print(' - Sync fork with upstream remote') if ref_type(self.default_ref) != 'branch': message = colored(' - Can only sync branches', 'red') self._print(message) self._exit(message) fork_remote_output = fmt.remote_string(fork_remote) branch_output = fmt.ref_string(truncate_ref(self.default_ref)) if rebase: self._rebase_remote_branch(self.remote, truncate_ref(self.default_ref)) else: self._pull(self.remote, truncate_ref(self.default_ref)) self._print(' - Push to ' + fork_remote_output + ' ' + branch_output) command = ['git', 'push', fork_remote, truncate_ref(self.default_ref)] try: execute_command(command, self.repo_path, print_output=self._print_output) except ClowderError: message = colored(' - Failed to push to ', 'red') + fork_remote_output + ' ' + branch_output self._print(message) self._print(fmt.command_failed_error(command)) self._exit(message)
def _herd_initial(self, url, depth=0): """Herd ref initial .. py:function:: _herd_initial(url, depth=0) :param str url: URL of repo :param Optional[int] depth: Git clone depth. 0 indicates full clone, otherwise must be a positive integer """ self._init_repo() self._create_remote(self.remote, url, remove_dir=True) if ref_type(self.default_ref) == 'branch': self._checkout_new_repo_branch(truncate_ref(self.default_ref), depth) elif ref_type(self.default_ref) == 'tag': self._checkout_new_repo_tag(truncate_ref(self.default_ref), self.remote, depth, remove_dir=True) elif ref_type(self.default_ref) == 'sha': self._checkout_new_repo_commit(self.default_ref, self.remote, depth)
def fetch(self, remote, **kwargs): """Fetch from a specific remote ref .. py:function:: fetch(remote, ref=None, depth=0, remove_dir=False, allow_failure=False) :param str remote: Remote name Keyword Args: ref (str): Ref to fetch depth (int): Git clone depth. 0 indicates full clone, otherwise must be a positive integer remove_dir (bool): Whether to remove the directory if commands fail allow_failure (bool): Whether to allow failure """ ref = kwargs.get('ref', None) depth = kwargs.get('depth', 0) remove_dir = kwargs.get('remove_dir', False) allow_failure = kwargs.get('allow_failure', False) remote_output = fmt.remote_string(remote) if depth == 0: self._print(' - Fetch from ' + remote_output) message = colored(' - Failed to fetch from ', 'red') error = message + remote_output command = ['git fetch', remote, '--prune --tags'] elif ref is None: command = ['git fetch', remote, '--depth', str(depth), '--prune --tags'] message = colored(' - Failed to fetch remote ', 'red') error = message + remote_output else: ref_output = fmt.ref_string(truncate_ref(ref)) self._print(' - Fetch from ' + remote_output + ' ' + ref_output) message = colored(' - Failed to fetch from ', 'red') error = message + remote_output + ' ' + ref_output command = ['git fetch', remote, truncate_ref(ref), '--depth', str(depth), '--prune --tags'] try: execute_command(command, self.repo_path, print_output=self._print_output) except ClowderError: if remove_dir: remove_directory(self.repo_path) if not allow_failure: self._print(error) self._exit(error)
def reset(self, depth=0): """Reset branch to upstream or checkout tag/sha as detached HEAD .. py:function:: reset(depth=0) :param Optional[int] depth: Git clone depth. 0 indicates full clone, otherwise must be a positive integer """ if ref_type(self.default_ref) == 'tag': self.fetch(self.remote, ref=self.default_ref, depth=depth) self._checkout_tag(truncate_ref(self.default_ref)) return if ref_type(self.default_ref) == 'sha': self.fetch(self.remote, ref=self.default_ref, depth=depth) self._checkout_sha(self.default_ref) return branch = truncate_ref(self.default_ref) if not self.existing_local_branch(branch): self._create_branch_local_tracking(branch, self.remote, depth=depth, fetch=True) return self._checkout_branch(branch) branch_output = fmt.ref_string(branch) remote_output = fmt.remote_string(self.remote) if not self.existing_remote_branch(branch, self.remote): message = colored(' - No existing remote branch ', 'red') + remote_output + ' ' + branch_output self._print(message) self._exit(message) self.fetch(self.remote, ref=self.default_ref, depth=depth) self._print(' - Reset branch ' + branch_output + ' to ' + remote_output + ' ' + branch_output) remote_branch = self.remote + '/' + branch self._reset_head(branch=remote_branch)
def prune_branch_local(self, branch, force): """Prune local branch :param str branch: Branch name to delete :param bool force: Force delete branch """ branch_output = fmt.ref_string(branch) if branch not in self.repo.heads: self._print(' - Local branch ' + branch_output + " doesn't exist") return prune_branch = self.repo.heads[branch] if self.repo.head.ref == prune_branch: ref_output = fmt.ref_string(truncate_ref(self.default_ref)) try: self._print(' - Checkout ref ' + ref_output) self.repo.git.checkout(truncate_ref(self.default_ref)) except GitError as err: message = colored(' - Failed to checkout ref', 'red') + ref_output self._print(message) self._print(fmt.error(err)) self._exit(message) except (KeyboardInterrupt, SystemExit): self._exit() try: self._print(' - Delete local branch ' + branch_output) self.repo.delete_head(branch, force=force) except GitError as err: message = colored(' - Failed to delete local branch ', 'red') + branch_output self._print(message) self._print(fmt.error(err)) self._exit(message) except (KeyboardInterrupt, SystemExit): self._exit()
def test_truncate_ref_tag(self): """Test _truncate_ref() function for tag ref""" self.assertEqual(truncate_ref(self.tag_ref), 'v1.0')
def test_truncate_ref_sha(self): """Test _truncate_ref() function for sha ref""" self.assertEqual(truncate_ref(self.sha_ref), self.sha_ref)
def test_truncate_ref_branch(self): """Test _truncate_ref() function for branch ref""" self.assertEqual(truncate_ref(self.branch_ref), 'master')