def post_merge(dst_branch, database, squash): merge_info = git.reflog(False)[0] res = re.search(r".*: merge (\w+):.*", merge_info) if res: src_branch = res.group(1) logging.info("Branch '%s' was merged with us, '%s'", src_branch, dst_branch) logging.debug("Amalgamating patches from branch '%s' into one SQL file, and importing.", src_branch) patches = [patch for patch in list_applied_patches(src_branch, database) if ( patch not in list_merged_patches(src_branch, dst_branch, database) and patch not in list_ignored_patches(src_branch, database) and patch not in list_patches_resulting_from_merge(dst_branch, src_branch, database))] if not patches: logging.info("No patches to apply.") return output_file = NamedTemporaryFile(suffix=".sql", delete=False) for patch in patches: with open(patch, "r") as patchfile: output_file.write(patchfile.read()) output_file.flush() try: apply_patch(database, output_file.name, True) if dst_branch == "master": base_dir = os.path.join("sql", "development", database) patch_filename = free_patch_name() else: base_dir = os.path.join(".git", "gitdb", "patches", dst_branch, database) patch_filename = free_patch_name() patch_name = os.path.join(base_dir, patch_filename) makedirs(base_dir) shutil.copy(output_file.name, patch_name) add_patch_to_db(dst_branch, database, patch_name) add_merged_patches(patches, patch_name, src_branch, dst_branch, database) if dst_branch == "master": # If we are on master, add the SQL file and amend the commit. git.add(patch_name) git.amend_commit() except MySqlException: # Rollback occured. logging.error("SQL patch did not apply cleanly. This means that while the files in branch %s will have been updated, the database %s is not. Please bring the database to a consistent state manually (you can use the SQL information stored in %s for help), then run:", dst_branch, database, output_file.name) logging.error("foobar") else: handle_pull(dst_branch, database)
def handle_pull(branch, database): logging.info("New patches from pull:") if branch != "master": logging.warn("gitdb does not currently support remote tracking branches.") else: patches = [patch for patch in list_file_patches(branch, database) if patch not in list_applied_patches(branch, database) and patch not in list_ignored_patches(branch, database)] logging.info(patches) try: apply_patch(database, patches, True) for patch in patches: add_patch_to_db(branch, database, patch) except MySqlException: logging.error("Patches from pull failed to apply.") logging.error("Feel free to do whatever you like to the database to make it consistent. Then run git db merge.")
def commit_msg(branch, database, msgfile): """\ The commit-msg hook. We are called after the message has been set. We need to check if the commit has been accepted - if so, continue. Otherwise, cleanup after ourselves. """ with open(msgfile, "r") as msg_file: non_comment_lines = [line for line in msg_file.readlines() if not line.startswith("#") and line != "\n"] pending_patch = get_pending_patch(branch, database) if pending_patch: if len(non_comment_lines) == 0: logging.info("Empty commit message was given, cleaning up SQL files...") clean_pending(branch, database) else: logging.info("Valid commit message. Saving status database and cleaning indications.") if branch == "master": logging.debug("Working on master branch...") add_patch_to_db(branch, database, os.path.join("sql", "development", database, os.path.basename(pending_patch))) else: logging.debug("Working on local branch...") dest = os.path.join(".git", "gitdb", "patches", branch, database, os.path.basename(pending_patch)) os.rename(pending_patch, dest) add_patch_to_db(branch, database, dest) clean_pending(branch, database, use_git=False)