def rebase_patches(without_git_rebase=True, directory=None): ### Ensure a clean/valid working environment ret = ensure_clean_working_env(git_status=True, directory=directory) if ret != 0: return ret ### Make sure we need to actually call this # Get the current branch current_branch = get_current_branch(directory) # Get the patches branch patches_branch = "patches/" + current_branch # Get the current patches.conf config = get_patch_config(patches_branch, directory=directory) # Get the current upstream commit hash upstream_commit_hash = get_commit_hash(config["parent"], directory) # If the current upstream commit hash is the same as the stored one, noop if upstream_commit_hash == config["previous"]: debug( "Nothing to do: Current branch (" + current_branch + ")'s " "base commit hash is the same as the source branch (" + config["parent"] + ")'s commit hash." ) debug(" Did you forget to update the parent branch first?") debug( " Updating the parent branch can be done by calling " "'git-bloom-patch rebase' on it, or 'git-bloom-import-upsteam'" " if the parent branch is the upstream branch." ) return 0 else: debug( "rebase_patches: " + upstream_commit_hash + " == " + config["previous"] + ": " + str(upstream_commit_hash == config["previous"]) ) ### Execute the rebase if without_git_rebase: non_git_rebase(config["parent"], directory=directory) else: git_rebase(config["parent"], directory=directory) ### Update the patches information # Get the latest configs config = get_patch_config(patches_branch, directory) # Set the base to the current hash (before patches) config["base"] = get_commit_hash(current_branch, directory) # Set the new upstream hash to the previous upstream hash config["previous"] = get_commit_hash(config["parent"], directory) # Clear the trimbase (it needs to be reapplied) config["trimbase"] = "" # Write the new configs set_patch_config(patches_branch, config, directory) return 0
def post_rebase(self, destination): # Determine the current package being generated name = destination.split('/')[-1] distro = destination.split('/')[-2] # Retrieve the stackage stackage, kind = self.packages[name] # Ask to continue if interactive if self.interactive: if not maybe_continue('y'): error("Answered no to continue, aborting.") return code.ANSWERED_NO_TO_CONTINUE ### Start debian generation # Get time of day from dateutil import tz stamp = datetime.datetime.now(tz.tzlocal()) # Convert stackage to debian data data = self.convert_stackage_to_debian_data(stackage, kind) # Get apt_installer from rosdep from rosdep2.catkin_support import get_installer self.apt_installer = get_installer(APT_INSTALLER) # Create debians for each distro with inbranch(destination): self.generate_debian(data, stamp, distro) # Create the tag name for later self.tag_names[destination] = self.generate_tag_name(data) # Update the patch configs patches_branch = 'patches/' + destination config = get_patch_config(patches_branch) # Store it self.store_original_config(config, patches_branch) # Modify the base so import/export patch works config['base'] = get_commit_hash(get_current_branch()) # Set it set_patch_config(patches_branch, config)
def remove_patches(directory=None): # Get the current branch current_branch = get_current_branch(directory) # Ensure the current branch is valid if current_branch is None: error("Could not determine current branch, are you in a git repo?") return 1 # Construct the patches branch patches_branch = 'patches/' + current_branch try: # See if the patches branch exists if branch_exists(patches_branch, False, directory=directory): if not branch_exists(patches_branch, True, directory=directory): track_branches(patches_branch, directory) else: error("No patches branch (" + patches_branch + ") found, cannot " "remove patches.") return 1 # Get the parent branch from the patches branch config = get_patch_config(patches_branch, directory=directory) parent, spec = config['parent'], config['base'] if None in [parent, spec]: error("Could not retrieve patches info.") return 1 debug("Removing patches from " + current_branch + " back to base " "commit " + spec) # Reset this branch using git reset --hard spec execute_command('git reset --hard ' + spec, cwd=directory) finally: if current_branch: checkout(current_branch, directory=directory) return 0
def import_patches(directory=None): # Get current branch current_branch = get_current_branch(directory) # Construct the patches branch name patches_branch = 'patches/' + current_branch # Ensure the patches branch exists and is tracked if branch_exists(patches_branch, False, directory=directory): if not branch_exists(patches_branch, True, directory=directory): track_branches(patches_branch, directory) else: error("The patches branch ({0}) does not ".format(patches_branch) + \ "exist, did you use git-bloom-branch?") return code.BRANCH_DOES_NOT_EXIST # Create a swap space tmp_dir = tempfile.mkdtemp() try: # Get parent branch and base commit from patches branch config = get_patch_config(patches_branch, directory) parent_branch, commit = config['parent'], config['base'] if commit != get_commit_hash(current_branch, directory): warning("The current commit is not the same as the most recent " "rebase commit. This might mean that you have committed " "since the last time you did 'git-bloom-patch export'.") return code.PATCHES_NOT_EXPORTED # Checkout to the patches branch checkout(patches_branch, directory=directory) # Copy the patches to a temp location patches = list_patches(directory) if len(patches) == 0: debug("No patches in the patches branch, nothing to do") return code.NOTHING_TO_DO tmp_dir_patches = [] for patch in patches: tmp_dir_patches.append(os.path.join(tmp_dir, patch)) if directory is not None: patch = os.path.join(directory, patch) shutil.copy(patch, tmp_dir) # Now checkout back to the original branch and import them checkout(current_branch, directory=directory) cmd = 'git am {0}*.patch'.format(tmp_dir + os.sep) execute_command(cmd, cwd=directory) # Notify the user info("Applied {0} patches".format(len(patches))) finally: if current_branch: checkout(current_branch, directory=directory) if os.path.exists(tmp_dir): shutil.rmtree(tmp_dir) return 0
def export_patches(directory=None): ### Ensure a clean/valid working environment ret = ensure_clean_working_env(git_status=True, directory=directory) if ret != 0: return ret # Get current branch current_branch = get_current_branch(directory) # Construct the patches branch name patches_branch = "patches/" + current_branch # Ensure the patches branch exists if not branch_exists(patches_branch, False, directory=directory): error("The patches branch ({0}) does not ".format(patches_branch) + "exist, did you use git-bloom-branch?") return 1 try: # Get parent branch and base commit from patches branch config = get_patch_config(patches_branch, directory) if config is None: error("Failed to get patches information.") return 1 # Checkout to the patches branch checkout(patches_branch, directory=directory) # Notify the user debug("Exporting patches from " "{0}...{1}".format(config["base"], current_branch)) # Remove all the old patches if len(list_patches(directory)) > 0: cmd = "git rm ./*.patch" execute_command(cmd, cwd=directory) # Create the patches using git format-patch cmd = "git format-patch -M -B " "{0}...{1}".format(config["base"], current_branch) execute_command(cmd, cwd=directory) # Report of the number of patches created patches_list = list_patches(directory) debug("Created {0} patches".format(len(patches_list))) # Clean up and commit if len(patches_list) > 0: cmd = "git add ./*.patch" execute_command(cmd, cwd=directory) if has_changes(directory): cmd = 'git commit -m "Updating patches."' execute_command(cmd, cwd=directory) finally: if current_branch: checkout(current_branch, directory=directory) return 0
def trim(sub_dir=None, force=False, undo=False, directory=None): # Get the current branch current_branch = get_current_branch(directory) # Ensure the current branch is valid if current_branch is None: error("Could not determine current branch, are you in a git repo?") return code.NOT_ON_A_GIT_BRANCH # Construct the patches branch patches_branch = 'patches/' + current_branch try: # See if the patches branch exists if branch_exists(patches_branch, False, directory=directory): if not branch_exists(patches_branch, True, directory=directory): track_branches(patches_branch, directory) else: error("No patches branch (" + patches_branch + ") found, cannot " "perform trim.") return code.BRANCH_DOES_NOT_EXIST # Get the parent branch from the patches branch config = get_patch_config(patches_branch, directory=directory) if config is None: error("Could not retrieve patches info.") return code.COULD_NOT_GET_PATCH_INFO # If sub_dir is set, try to set it new_config = _set_trim_sub_dir(sub_dir, force, config, directory) if new_config is None: return code.COULD_NOT_TRIM # Perform trime or undo if undo: new_config = _undo(new_config, directory) if new_config is None: return code.NOTHING_TO_DO else: new_config = _trim(new_config, force, directory) if new_config is None: return code.COULD_NOT_TRIM # Commit the new config set_patch_config(patches_branch, new_config, directory) finally: if current_branch: checkout(current_branch, directory=directory) return code.OK