def setup_repo_context(repo_url, repo_path): """Setup a repository, if an exception is raised then remove the repo. :repo_url: string url of the repo to clone :repo_path: string path to clone the repo to :returns: None """ # if there's any failure after cloning then we should remove the repo phlsys_subprocess.run( 'git', 'clone', repo_url, repo_path) try: repo = phlsys_git.Repo(repo_path) # test pushing to master repo('checkout', 'origin/master') phlgit_commit.allow_empty(repo, 'test commit for pushing') repo('push', 'origin', '--dry-run', 'HEAD:refs/heads/master') repo('checkout', '-') # test push to special refs repo( 'push', 'origin', '--dry-run', 'HEAD:refs/arcyd/test') repo( 'push', 'origin', '--dry-run', 'HEAD:refs/heads/dev/arcyd/test') # fetch the 'landed' and 'abandoned' refs if they exist abdt_git.checkout_master_fetch_special_refs(repo, 'origin') # success, allow the caller to do work yield except Exception: # clean up the git repo on any exception shutil.rmtree(repo_path) raise
def _checkout_archive_ref_branch( self, short_branch_name, fq_branch_name, initial_message): if self._is_ref(fq_branch_name): phlgit_checkout.branch(self, short_branch_name) else: phlgit_checkout.orphan_clean(self, short_branch_name) phlgit_commit.allow_empty(self, initial_message)
def _checkout_archive_ref_branch(self, short_branch_name, fq_branch_name, initial_message): if self._is_ref(fq_branch_name): phlgit_checkout.branch(self, short_branch_name) else: phlgit_checkout.orphan_clean(self, short_branch_name) phlgit_commit.allow_empty(self, initial_message)
def ensure_reserve_branch(repo): """Ensure that the supplied 'repo' remote has the reserve branch. To prevent the problem where someone pushes branch 'dev', which blocks arcyd's tracker branches from being created. :repo: a callable supporting git commands, e.g. repo("status") :returns: None """ reserve_name = phlgitu_ref.Name(_RESERVE_BRANCH_FQ_NAME) if not is_remote_reserve_branch_present(repo): phlgit_checkout.orphan_clean(repo, reserve_name.short) phlgit_commit.allow_empty(repo, _RESERVE_BRANCH_MESSAGE) phlgit_push.push(repo, reserve_name.short, 'origin') phlgit_checkout.previous_branch(repo) phlgit_branch.force_delete(repo, reserve_name.short)
def setup_repo_context(repo_url, repo_path, repo_push_url=None): """Setup a repository, if an exception is raised then remove the repo. :repo_url: string url of the repo to clone :repo_path: string path to clone the repo to :repo_push_url: string url to push to, or None :returns: None """ # if there's any failure after cloning then we should remove the repo if repo_push_url is not None: phlsys_subprocess.run( 'git', 'clone', repo_url, repo_path, '--config', 'remote.origin.pushurl=' + repo_push_url) else: phlsys_subprocess.run( 'git', 'clone', repo_url, repo_path) try: repo = phlsys_git.Repo(repo_path) # make sure we have no problems with 'ident' strings, we won't build # from arcyd so it shouldn't be externally visible that we don't expand # them. phlgitx_ignoreattributes.ensure_repo_ignoring(repo_path) # test pushing to master repo('checkout', 'origin/master') phlgit_commit.allow_empty(repo, 'test commit for pushing') repo('push', 'origin', '--dry-run', 'HEAD:refs/heads/master') repo('checkout', '-') try_push_special_refs(repo) # fetch the 'landed' and 'abandoned' refs if they exist abdt_git.checkout_master_fetch_special_refs(repo, 'origin') ensure_reserve_branch(repo) # success, allow the caller to do work yield except Exception: # clean up the git repo on any exception shutil.rmtree(repo_path) raise
def setup_repo_context(repo_url, repo_path, repo_push_url=None): """Setup a repository, if an exception is raised then remove the repo. :repo_url: string url of the repo to clone :repo_path: string path to clone the repo to :repo_push_url: string url to push to, or None :returns: None """ # if there's any failure after cloning then we should remove the repo if repo_push_url is not None: phlsys_subprocess.run('git', 'clone', repo_url, repo_path, '--config', 'remote.origin.pushurl=' + repo_push_url) else: phlsys_subprocess.run('git', 'clone', repo_url, repo_path) try: repo = phlsys_git.Repo(repo_path) # make sure we have no problems with 'ident' strings, we won't build # from arcyd so it shouldn't be externally visible that we don't expand # them. phlgitx_ignoreattributes.ensure_repo_ignoring(repo_path) # test pushing to master repo('checkout', 'origin/master') phlgit_commit.allow_empty(repo, 'test commit for pushing') repo('push', 'origin', '--dry-run', 'HEAD:refs/heads/master') repo('checkout', '-') try_push_special_refs(repo) # fetch the 'landed' and 'abandoned' refs if they exist abdt_git.checkout_master_fetch_special_refs(repo, 'origin') ensure_reserve_branch(repo) # success, allow the caller to do work yield except Exception: # clean up the git repo on any exception shutil.rmtree(repo_path) raise
def setup_repo_context(repo_url, repo_path): """Setup a repository, if an exception is raised then remove the repo. :repo_url: string url of the repo to clone :repo_path: string path to clone the repo to :returns: None """ # if there's any failure after cloning then we should remove the repo phlsys_subprocess.run( 'git', 'clone', repo_url, repo_path) try: repo = phlsys_git.Repo(repo_path) # test pushing to master repo('checkout', 'origin/master') phlgit_commit.allow_empty(repo, 'test commit for pushing') repo('push', 'origin', '--dry-run', 'HEAD:refs/heads/master') repo('checkout', '-') # test push to special refs repo( 'push', 'origin', '--dry-run', 'HEAD:refs/arcyd/test') repo( 'push', 'origin', '--dry-run', 'HEAD:refs/heads/dev/arcyd/test') # fetch the 'landed' and 'abandoned' refs if they exist ref_list = set(repo('ls-remote').split()[1::2]) special_refs = [ (abdt_git.ARCYD_ABANDONED_REF, abdt_git.ARCYD_ABANDONED_BRANCH_FQ), (abdt_git.ARCYD_LANDED_REF, abdt_git.ARCYD_LANDED_BRANCH_FQ), ] for ref in special_refs: if ref[0] in ref_list: repo('fetch', 'origin', '{}:{}'.format(ref[0], ref[1])) # success, allow the caller to do work yield except Exception: # clean up the git repo on any exception shutil.rmtree(repo_path) raise
def process(args): fs = abdt_fs.make_default_accessor() try_touch_path = fs.layout.repo_try(args.name) ok_touch_path = fs.layout.repo_ok(args.name) repo_path = fs.layout.repo(args.name) # make sure the repo doesn't exist already if os.path.exists(repo_path): raise Exception('{} already exists'.format(repo_path)) # make sure the phabricator config exists phab_config_path = fs.get_phabricator_config_rel_path( args.phabricator_name) # make sure we can use the snoop URL if args.repo_snoop_url: phlurl_request.get(args.repo_snoop_url) # generate the config file config = _CONFIG.format( phabricator_config=phab_config_path, repo_desc=args.repo_desc, repo_path=repo_path, try_touch_path=try_touch_path, ok_touch_path=ok_touch_path, arcyd_email=args.arcyd_email, admin_email=args.admin_email) if args.repo_snoop_url: config = '\n'.join([ config, _CONFIG_SNOOP_URL.format( repo_snoop_url=args.repo_snoop_url)]) if args.review_url_format: config = '\n'.join([ config, _CONFIG_REVIEW_URL.format( review_url_format=args.review_url_format)]) if args.branch_url_format: config = '\n'.join([ config, _CONFIG_BRANCH_URL.format( branch_url_format=args.branch_url_format)]) # if there's any failure after cloning then we should remove the repo phlsys_subprocess.run( 'git', 'clone', args.repo_url, repo_path) try: repo = phlsys_git.Repo(repo_path) # test pushing to master repo.call('checkout', 'origin/master') phlgit_commit.allow_empty(repo, 'test commit for pushing') repo.call('push', 'origin', '--dry-run', 'HEAD:refs/heads/master') repo.call('checkout', '-') # test push to special refs repo.call( 'push', 'origin', '--dry-run', 'HEAD:refs/arcyd/test') repo.call( 'push', 'origin', '--dry-run', 'HEAD:refs/heads/dev/arcyd/test') # fetch the 'landed' and 'abandoned' refs if they exist ref_list = set(repo.call('ls-remote').split()[1::2]) special_refs = [ (abdt_git.ARCYD_ABANDONED_REF, abdt_git.ARCYD_ABANDONED_BRANCH_FQ), (abdt_git.ARCYD_LANDED_REF, abdt_git.ARCYD_LANDED_BRANCH_FQ), ] for ref in special_refs: if ref[0] in ref_list: repo.call('fetch', 'origin', '{}:{}'.format(ref[0], ref[1])) # success, write out the config fs.create_repo_config(args.name, config) except Exception: # clean up the git repo shutil.rmtree(repo_path) raise