Example #1
0
 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
Example #2
0
        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