| Index: trychange.py
|
| diff --git a/trychange.py b/trychange.py
|
| index 8fe2b5fb17eafa0ff879d0d2bbf5bd92a515d216..d181e141baff4c312c8fd1c8343fc98c8918991c 100755
|
| --- a/trychange.py
|
| +++ b/trychange.py
|
| @@ -611,7 +611,15 @@ def _GetPatchGitRepo(git_url):
|
|
|
|
|
| def _SendChangeGit(bot_spec, options):
|
| - """Send a change to the try server by committing a diff file to a GIT repo"""
|
| + """Sends a change to the try server by committing a diff file to a GIT repo.
|
| +
|
| + Creates a temp orphan branch, commits patch.diff, creates a ref pointing to
|
| + that commit, deletes the temp branch, checks master out, adds 'ref' file
|
| + containing the name of the new ref, pushes master and the ref to the origin.
|
| +
|
| + TODO: instead of creating a temp branch, use git-commit-tree.
|
| + """
|
| +
|
| if not options.git_repo:
|
| raise NoTryServerAccess('Please use the --git_repo option to specify the '
|
| 'try server git repository to connect to.')
|
| @@ -640,35 +648,50 @@ def _SendChangeGit(bot_spec, options):
|
| with _PrepareDescriptionAndPatchFiles(description, options) as (
|
| patch_filename, description_filename):
|
| logging.info('Committing patch')
|
| - target_branch = 'refs/patches/%s/%s' % (
|
| +
|
| + temp_branch = 'tmp_patch'
|
| + target_ref = 'refs/patches/%s/%s' % (
|
| Escape(options.user),
|
| os.path.basename(patch_filename).replace(' ','_'))
|
| target_filename = os.path.join(patch_dir, 'patch.diff')
|
| branch_file = os.path.join(patch_dir, GIT_BRANCH_FILE)
|
| +
|
| + patch_git('checkout', 'master')
|
| try:
|
| + # Try deleting an existing temp branch, if any.
|
| + try:
|
| + patch_git('branch', '-D', temp_branch)
|
| + logging.debug('Deleted an existing temp branch.')
|
| + except subprocess2.CalledProcessError:
|
| + pass
|
| # Create a new branch and put the patch there.
|
| - patch_git('checkout', '--orphan', target_branch)
|
| + patch_git('checkout', '--orphan', temp_branch)
|
| patch_git('reset')
|
| patch_git('clean', '-f')
|
| shutil.copyfile(patch_filename, target_filename)
|
| add_and_commit(target_filename, description_filename)
|
| assert not scm.GIT.IsWorkTreeDirty(patch_dir)
|
|
|
| - # Update the branch file in the master
|
| + # Create a ref and point it to the commit referenced by temp_branch.
|
| + patch_git('update-ref', target_ref, temp_branch)
|
| +
|
| + # Delete the temp ref.
|
| patch_git('checkout', 'master')
|
| + patch_git('branch', '-D', temp_branch)
|
|
|
| + # Update the branch file in the master.
|
| def update_branch():
|
| with open(branch_file, 'w') as f:
|
| - f.write(target_branch)
|
| + f.write(target_ref)
|
| add_and_commit(branch_file, description_filename)
|
|
|
| update_branch()
|
|
|
| - # Push master and target_branch to origin.
|
| + # Push master and target_ref to origin.
|
| logging.info('Pushing patch')
|
| for attempt in xrange(_GIT_PUSH_ATTEMPTS):
|
| try:
|
| - patch_git('push', 'origin', 'master', target_branch)
|
| + patch_git('push', 'origin', 'master', target_ref)
|
| except subprocess2.CalledProcessError as e:
|
| is_last = attempt == _GIT_PUSH_ATTEMPTS - 1
|
| if is_last:
|
|
|