def commit_if_necessary(): status = git_tool.status() if status is None: return None, "Status is none??" if len(status.staged) > 0: return git_tool.gitcmd(["commit", "-nm", message]) return None, None
def do_the_revert(): GIT_COMMIT_FIELDS = ['id', 'author_name', 'author_email', 'date', 'message'] GIT_LOG_FORMAT = ['%H', '%an', '%ae', '%ad', '%B'] GIT_LOG_FORMAT = '%x1f'.join(GIT_LOG_FORMAT) + '%x1e' REVERT_TEMPLATE = """Revert "{message}"\n\nThis reverts commit {commit}.""" # ":" is added to issue id to prevent mistakes (--grep AN-xxx:) (log, err) = git_tool.gitcmd(['log', '--grep', issue+':', '--format={}'.format(GIT_LOG_FORMAT)]) if not log: return log, err # turn log into a list of dictionaries for for easier use log = log.strip('\n\x1e').split("\x1e") log = [row.strip().split("\x1f") for row in log] log = [dict(zip(GIT_COMMIT_FIELDS, row)) for row in log] # filter only those commits which have not been reverted already revert_candidates = filter(should_revert, log) ret = None if not revert_candidates else '\n'.join(map(str, revert_candidates)) if not dry_run: for commit in revert_candidates: # try reverting revert_ret, revert_err = git_tool.gitcmd(['revert','--no-edit',commit['id']]) submodules = None if revert_err is not None: # try resolving submodule reference issues automatically gitstatus = git_tool.status() if submodules is None: submodules = git_tool.get_submodules() if submodules is None: return ret, err non_subs = set(gitstatus.conflict) - set(submodules) if len(non_subs) > 0: print "Conflict in non submodules %r" % non_subs return revert_ret, revert_err for sub in gitstatus.conflict: print "Adding %s" % sub add_ret, add_err = git_tool.gitcmd(['add', sub]) if add_err is not None: return revert_ret, revert_err commit_ret, commit_err = git_tool.gitcmd(['commit', '-m', REVERT_TEMPLATE.format(message=commit['message'], commit=commit['id'])]) return commit_ret, commit_err if revert_err: ret = revert_ret err = revert_err return ret, err