Add Python 3 support.
Since git-review made it to http://py3ksupport.appspot.com/, why don't support Python 3. Change-Id: I75c28e4887ca79e794553758d671c75740849f97
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -4,3 +4,4 @@ Saggi Mizrahi <smizrahi@redhat.com>
 | 
			
		||||
Kiall Mac Innes <kiall@managedit.ie>
 | 
			
		||||
Roan Kattouw <roan.kattouw@gmail.com>
 | 
			
		||||
Antoine Musso <hashar@free.fr>
 | 
			
		||||
Yuriy Taraday <yorik.sar@gmail.com>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										157
									
								
								git-review
									
									
									
									
									
								
							
							
						
						
									
										157
									
								
								git-review
									
									
									
									
									
								
							@@ -1,4 +1,6 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
 | 
			
		||||
COPYRIGHT = """\
 | 
			
		||||
Copyright (C) 2011-2012 OpenStack LLC.
 | 
			
		||||
 | 
			
		||||
@@ -16,12 +18,17 @@ implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License."""
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import urllib
 | 
			
		||||
import json
 | 
			
		||||
 | 
			
		||||
from distutils.version import StrictVersion
 | 
			
		||||
from urlparse import urlparse
 | 
			
		||||
import ConfigParser
 | 
			
		||||
if sys.version < '3':
 | 
			
		||||
    from urlparse import urlparse
 | 
			
		||||
    import ConfigParser
 | 
			
		||||
else:
 | 
			
		||||
    from urllib.parse import urlparse
 | 
			
		||||
    import configparser as ConfigParser
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
import os
 | 
			
		||||
@@ -52,13 +59,14 @@ class colors:
 | 
			
		||||
 | 
			
		||||
def run_command(cmd, status=False, env={}):
 | 
			
		||||
    if VERBOSE:
 | 
			
		||||
        print datetime.datetime.now(), "Running:", cmd
 | 
			
		||||
        print(datetime.datetime.now(), "Running:", cmd)
 | 
			
		||||
    cmd_list = shlex.split(str(cmd))
 | 
			
		||||
    newenv = os.environ
 | 
			
		||||
    newenv.update(env)
 | 
			
		||||
    p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
 | 
			
		||||
                         stderr=subprocess.STDOUT, env=newenv)
 | 
			
		||||
    (out, nothing) = p.communicate()
 | 
			
		||||
    out = out.decode('utf-8')
 | 
			
		||||
    if status:
 | 
			
		||||
        return (p.returncode, out.strip())
 | 
			
		||||
    return out.strip()
 | 
			
		||||
@@ -129,7 +137,7 @@ def set_hooks_commit_msg(remote, target_file):
 | 
			
		||||
 | 
			
		||||
    if not os.path.exists(target_file) or UPDATE:
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print "Fetching commit hook from: scp://%s:%s" % (hostname, port)
 | 
			
		||||
            print("Fetching commit hook from: scp://%s:%s" % (hostname, port))
 | 
			
		||||
        scp_cmd = "scp "
 | 
			
		||||
        if port is not None:
 | 
			
		||||
            scp_cmd += "-P%s " % port
 | 
			
		||||
@@ -140,8 +148,8 @@ def set_hooks_commit_msg(remote, target_file):
 | 
			
		||||
        scp_cmd += ":hooks/commit-msg %s" % target_file
 | 
			
		||||
        (status, scp_output) = run_command_status(scp_cmd)
 | 
			
		||||
        if status != 0:
 | 
			
		||||
            print "Problems encountered installing commit-msg hook"
 | 
			
		||||
            print scp_output
 | 
			
		||||
            print("Problems encountered installing commit-msg hook")
 | 
			
		||||
            print(scp_output)
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
    if not os.access(target_file, os.X_OK):
 | 
			
		||||
@@ -162,11 +170,11 @@ def test_remote(username, hostname, port, project):
 | 
			
		||||
    (status, ssh_output) = run_command_status(cmd)
 | 
			
		||||
    if status == 0:
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print "%s@%s:%s worked." % (username, hostname, port)
 | 
			
		||||
            print("%s@%s:%s worked." % (username, hostname, port))
 | 
			
		||||
        return True
 | 
			
		||||
    else:
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print "%s@%s:%s did not work." % (username, hostname, port)
 | 
			
		||||
            print("%s@%s:%s did not work." % (username, hostname, port))
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -192,18 +200,18 @@ def add_remote(hostname, port, project, remote):
 | 
			
		||||
 | 
			
		||||
    remote_url = make_remote_url(username, hostname, port, project)
 | 
			
		||||
    if VERBOSE:
 | 
			
		||||
        print "No remote set, testing %s" % remote_url
 | 
			
		||||
        print("No remote set, testing %s" % remote_url)
 | 
			
		||||
    if not test_remote(username, hostname, port, project):
 | 
			
		||||
        print "Could not connect to gerrit."
 | 
			
		||||
        print("Could not connect to gerrit.")
 | 
			
		||||
        username = raw_input("Enter your gerrit username: ")
 | 
			
		||||
        remote_url = make_remote_url(username, hostname, port, project)
 | 
			
		||||
        print "Trying again with %s" % remote_url
 | 
			
		||||
        print("Trying again with %s" % remote_url)
 | 
			
		||||
        if not test_remote(username, hostname, port, project):
 | 
			
		||||
            raise Exception("Could not connect to gerrit at %s" % remote_url)
 | 
			
		||||
        asked_for_username = True
 | 
			
		||||
 | 
			
		||||
    print "Creating a git remote called \"%s\" that maps to:" % remote
 | 
			
		||||
    print "\t%s" % remote_url
 | 
			
		||||
    print("Creating a git remote called \"%s\" that maps to:" % remote)
 | 
			
		||||
    print("\t%s" % remote_url)
 | 
			
		||||
    cmd = "git remote add -f %s %s" % (remote, remote_url)
 | 
			
		||||
    (status, remote_output) = run_command_status(cmd)
 | 
			
		||||
 | 
			
		||||
@@ -211,11 +219,11 @@ def add_remote(hostname, port, project, remote):
 | 
			
		||||
        raise Exception("Error running %s" % cmd)
 | 
			
		||||
 | 
			
		||||
    if asked_for_username:
 | 
			
		||||
        print
 | 
			
		||||
        print "This repository is now set up for use with git-review."
 | 
			
		||||
        print "You can set the default username for future repositories with:"
 | 
			
		||||
        print '  git config --global --add gitreview.username "%s"' % username
 | 
			
		||||
        print
 | 
			
		||||
        print()
 | 
			
		||||
        print("This repository is now set up for use with git-review.")
 | 
			
		||||
        print("You can set the default username for future repositories with:")
 | 
			
		||||
        print('  git config --global --add gitreview.username "%s"' % username)
 | 
			
		||||
        print()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parse_git_show(remote, verb):
 | 
			
		||||
@@ -234,7 +242,7 @@ def parse_git_show(remote, verb):
 | 
			
		||||
    port = parsed_url.port
 | 
			
		||||
 | 
			
		||||
    if VERBOSE:
 | 
			
		||||
        print "Found origin %s URL:" % verb, fetch_url
 | 
			
		||||
        print("Found origin %s URL:" % verb, fetch_url)
 | 
			
		||||
 | 
			
		||||
    # Workaround bug in urlparse on OSX
 | 
			
		||||
    if parsed_url.scheme == "ssh" and parsed_url.path[:2] == "//":
 | 
			
		||||
@@ -298,11 +306,11 @@ def update_remote(remote):
 | 
			
		||||
    cmd = "git remote update %s" % remote
 | 
			
		||||
    (status, output) = run_command_status(cmd)
 | 
			
		||||
    if VERBOSE:
 | 
			
		||||
        print output
 | 
			
		||||
        print(output)
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print "Problem running '%s'" % cmd
 | 
			
		||||
        print("Problem running '%s'" % cmd)
 | 
			
		||||
        if not VERBOSE:
 | 
			
		||||
            print output
 | 
			
		||||
            print(output)
 | 
			
		||||
        return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
@@ -325,24 +333,24 @@ def check_remote(branch, remote, hostname, port, project):
 | 
			
		||||
                return
 | 
			
		||||
        # We have the remote, but aren't set up to fetch. Fix it
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print "Setting up gerrit branch tracking for better rebasing"
 | 
			
		||||
            print("Setting up gerrit branch tracking for better rebasing")
 | 
			
		||||
        update_remote(remote)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if hostname == False or port == False or project == False:
 | 
			
		||||
        # This means there was no .gitreview file
 | 
			
		||||
        print "No '.gitreview' file found in this repository."
 | 
			
		||||
        print "We don't know where your gerrit is. Please manually create "
 | 
			
		||||
        print "a remote named gerrit and try again."
 | 
			
		||||
        print("No '.gitreview' file found in this repository.")
 | 
			
		||||
        print("We don't know where your gerrit is. Please manually create ")
 | 
			
		||||
        print("a remote named gerrit and try again.")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    # Gerrit remote not present, try to add it
 | 
			
		||||
    try:
 | 
			
		||||
        add_remote(hostname, port, project, remote)
 | 
			
		||||
    except:
 | 
			
		||||
        print sys.exc_info()[2]
 | 
			
		||||
        print "We don't know where your gerrit is. Please manually create "
 | 
			
		||||
        print "a remote named \"%s\" and try again." % remote
 | 
			
		||||
        print(sys.exc_info()[2])
 | 
			
		||||
        print("We don't know where your gerrit is. Please manually create ")
 | 
			
		||||
        print("a remote named \"%s\" and try again." % remote)
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -356,8 +364,8 @@ def rebase_changes(branch, remote):
 | 
			
		||||
    cmd = "git rebase -i %s" % remote_branch
 | 
			
		||||
    (status, output) = run_command_status(cmd, env=dict(GIT_EDITOR='true'))
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print "Errors running %s" % cmd
 | 
			
		||||
        print output
 | 
			
		||||
        print("Errors running %s" % cmd)
 | 
			
		||||
        print(output)
 | 
			
		||||
        return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
@@ -400,27 +408,28 @@ def assert_one_change(remote, branch, yes, have_hook):
 | 
			
		||||
              (use_color, branch_name, remote, branch)
 | 
			
		||||
    (status, output) = run_command_status(cmd)
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print "Had trouble running %s" % cmd
 | 
			
		||||
        print output
 | 
			
		||||
        print("Had trouble running %s" % cmd)
 | 
			
		||||
        print(output)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    output_lines = len(output.split("\n"))
 | 
			
		||||
    if output_lines == 1 and not have_hook:
 | 
			
		||||
        print "Your change was committed before the commit hook was installed"
 | 
			
		||||
        print "Amending the commit to add a gerrit change id"
 | 
			
		||||
        print("Your change was committed before the commit hook was installed")
 | 
			
		||||
        print("Amending the commit to add a gerrit change id")
 | 
			
		||||
        run_command("git commit --amend", env=dict(GIT_EDITOR='true'))
 | 
			
		||||
    elif output_lines == 0:
 | 
			
		||||
        print "No changes between HEAD and %s/%s." % (remote, branch)
 | 
			
		||||
        print "Submitting for review would be pointless."
 | 
			
		||||
        print("No changes between HEAD and %s/%s." % (remote, branch))
 | 
			
		||||
        print("Submitting for review would be pointless.")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    elif output_lines > 1:
 | 
			
		||||
        if not yes:
 | 
			
		||||
            print "You have more than one commit that you are about to submit."
 | 
			
		||||
            print "The outstanding commits are:\n\n%s\n" % output
 | 
			
		||||
            print "Is this really what you meant to do?"
 | 
			
		||||
            print("You have more than one commit"
 | 
			
		||||
                    " that you are about to submit.")
 | 
			
		||||
            print("The outstanding commits are:\n\n%s\n" % output)
 | 
			
		||||
            print("Is this really what you meant to do?")
 | 
			
		||||
            yes_no = raw_input("Type 'yes' to confirm: ")
 | 
			
		||||
            if yes_no.lower().strip() != "yes":
 | 
			
		||||
                print "Aborting."
 | 
			
		||||
                print "Please rebase/squash your changes and try again"
 | 
			
		||||
                print("Aborting.")
 | 
			
		||||
                print("Please rebase/squash your changes and try again")
 | 
			
		||||
                sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -465,25 +474,25 @@ def list_reviews(remote):
 | 
			
		||||
                                          % (ssh_cmd, hostname, query_string))
 | 
			
		||||
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print "Could not fetch review information from gerrit"
 | 
			
		||||
        print output
 | 
			
		||||
        print("Could not fetch review information from gerrit")
 | 
			
		||||
        print(output)
 | 
			
		||||
        return status
 | 
			
		||||
 | 
			
		||||
    for line in output.split("\n"):
 | 
			
		||||
        # Warnings from ssh wind up in this output
 | 
			
		||||
        if line[0] != "{":
 | 
			
		||||
            print line
 | 
			
		||||
            print(line)
 | 
			
		||||
            continue
 | 
			
		||||
        try:
 | 
			
		||||
            review_info = json.loads(line)
 | 
			
		||||
        except:
 | 
			
		||||
            if VERBOSE:
 | 
			
		||||
                print output
 | 
			
		||||
            print "Could not parse json query response:", sys.exc_info()[1]
 | 
			
		||||
                print(output)
 | 
			
		||||
            print("Could not parse json query response:", sys.exc_info()[1])
 | 
			
		||||
            return 1
 | 
			
		||||
 | 
			
		||||
        if 'type' in review_info:
 | 
			
		||||
            print "Found %d items for review" % review_info['rowCount']
 | 
			
		||||
            print("Found %d items for review" % review_info['rowCount'])
 | 
			
		||||
            break
 | 
			
		||||
 | 
			
		||||
        change = review_info['number']
 | 
			
		||||
@@ -492,7 +501,7 @@ def list_reviews(remote):
 | 
			
		||||
        if check_color_support():
 | 
			
		||||
            change = colors.yellow + change + colors.reset
 | 
			
		||||
            branch = colors.green + branch + colors.reset
 | 
			
		||||
        print "%s  %s  %s" % (change, branch, subject)
 | 
			
		||||
        print("%s  %s  %s" % (change, branch, subject))
 | 
			
		||||
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
@@ -515,8 +524,8 @@ def download_review(review, masterbranch, remote):
 | 
			
		||||
                                           % (ssh_cmd, hostname, query_string))
 | 
			
		||||
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print "Could not fetch review information from gerrit"
 | 
			
		||||
        print output
 | 
			
		||||
        print("Could not fetch review information from gerrit")
 | 
			
		||||
        print(output)
 | 
			
		||||
        return status
 | 
			
		||||
    review_jsons = output.split("\n")
 | 
			
		||||
    found_review = False
 | 
			
		||||
@@ -530,8 +539,8 @@ def download_review(review, masterbranch, remote):
 | 
			
		||||
            break
 | 
			
		||||
    if not found_review:
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print output
 | 
			
		||||
        print "Could not find a gerrit review with id: %s" % review
 | 
			
		||||
            print(output)
 | 
			
		||||
        print("Could not find a gerrit review with id: %s" % review)
 | 
			
		||||
        return 1
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
@@ -545,60 +554,60 @@ def download_review(review, masterbranch, remote):
 | 
			
		||||
    revision = review_info['currentPatchSet']['revision']
 | 
			
		||||
    refspec = review_info['currentPatchSet']['ref']
 | 
			
		||||
 | 
			
		||||
    print "Downloading %s from gerrit into %s" % (refspec, branch_name)
 | 
			
		||||
    print("Downloading %s from gerrit into %s" % (refspec, branch_name))
 | 
			
		||||
    (status, output) = run_command_status("git fetch %s %s"
 | 
			
		||||
        % (remote, refspec))
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print output
 | 
			
		||||
        print(output)
 | 
			
		||||
        return status
 | 
			
		||||
 | 
			
		||||
    checkout_cmd = "git checkout -b %s FETCH_HEAD" % branch_name
 | 
			
		||||
    (status, output) = run_command_status(checkout_cmd)
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        if re.search("already exists\.?", output):
 | 
			
		||||
            print "Branch already exists - reusing"
 | 
			
		||||
            print("Branch already exists - reusing")
 | 
			
		||||
            checkout_cmd = "git checkout %s" % branch_name
 | 
			
		||||
            (status, output) = run_command_status(checkout_cmd)
 | 
			
		||||
            if status != 0:
 | 
			
		||||
                print output
 | 
			
		||||
                print(output)
 | 
			
		||||
                return status
 | 
			
		||||
            reset_cmd = "git reset --hard FETCH_HEAD"
 | 
			
		||||
            (status, output) = run_command_status(reset_cmd)
 | 
			
		||||
            if status != 0:
 | 
			
		||||
                print output
 | 
			
		||||
                print(output)
 | 
			
		||||
                return status
 | 
			
		||||
        else:
 | 
			
		||||
            print output
 | 
			
		||||
            print(output)
 | 
			
		||||
            return status
 | 
			
		||||
 | 
			
		||||
    print "Switched to branch '%s'" % branch_name
 | 
			
		||||
    print("Switched to branch '%s'" % branch_name)
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def finish_branch(target_branch):
 | 
			
		||||
    local_branch = get_branch_name(target_branch)
 | 
			
		||||
    if VERBOSE:
 | 
			
		||||
        print "Switching back to %s and deleting %s" % (target_branch,
 | 
			
		||||
                                                        local_branch)
 | 
			
		||||
        print("Switching back to %s and deleting %s" % (target_branch,
 | 
			
		||||
                                                        local_branch))
 | 
			
		||||
    checkout_cmd = "git checkout %s" % target_branch
 | 
			
		||||
    (status, output) = run_command_status(checkout_cmd)
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print output
 | 
			
		||||
        print(output)
 | 
			
		||||
        return status
 | 
			
		||||
    print "Switched to branch '%s'" % target_branch
 | 
			
		||||
    print("Switched to branch '%s'" % target_branch)
 | 
			
		||||
    close_cmd = "git branch -D %s" % local_branch
 | 
			
		||||
    (status, output) = run_command_status(close_cmd)
 | 
			
		||||
    if status != 0:
 | 
			
		||||
        print output
 | 
			
		||||
        print(output)
 | 
			
		||||
        return status
 | 
			
		||||
    print "Deleted branch '%s'" % local_branch
 | 
			
		||||
    print("Deleted branch '%s'" % local_branch)
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def print_exit_message(status, needs_update):
 | 
			
		||||
 | 
			
		||||
    if needs_update:
 | 
			
		||||
        print """
 | 
			
		||||
        print("""
 | 
			
		||||
***********************************************************
 | 
			
		||||
A new version of git-review is available on PyPI. Please
 | 
			
		||||
update your copy with:
 | 
			
		||||
@@ -607,7 +616,7 @@ update your copy with:
 | 
			
		||||
 | 
			
		||||
to ensure proper behavior with gerrit. Thanks!
 | 
			
		||||
***********************************************************
 | 
			
		||||
"""
 | 
			
		||||
""")
 | 
			
		||||
    sys.exit(status)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -668,7 +677,7 @@ def main():
 | 
			
		||||
    options = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    if options.license:
 | 
			
		||||
        print COPYRIGHT
 | 
			
		||||
        print(COPYRIGHT)
 | 
			
		||||
        sys.exit(0)
 | 
			
		||||
 | 
			
		||||
    branch = options.branch
 | 
			
		||||
@@ -694,7 +703,7 @@ def main():
 | 
			
		||||
        if topic is None:
 | 
			
		||||
            topic = get_topic(branch)
 | 
			
		||||
        if VERBOSE:
 | 
			
		||||
            print "Found topic '%s' from parsing changes." % topic
 | 
			
		||||
            print("Found topic '%s' from parsing changes." % topic)
 | 
			
		||||
 | 
			
		||||
        hook_file = get_hooks_target_file()
 | 
			
		||||
 | 
			
		||||
@@ -718,12 +727,12 @@ def main():
 | 
			
		||||
            cmd = "git push %s HEAD:refs/%s/%s/%s" % (remote, ref, branch,
 | 
			
		||||
                                                      topic)
 | 
			
		||||
            if options.dry:
 | 
			
		||||
                print "Please use the following command " \
 | 
			
		||||
                      "to send your commits to review:\n"
 | 
			
		||||
                print "\t%s\n" % cmd
 | 
			
		||||
                print("Please use the following command " \
 | 
			
		||||
                      "to send your commits to review:\n")
 | 
			
		||||
                print("\t%s\n" % cmd)
 | 
			
		||||
            else:
 | 
			
		||||
                (status, output) = run_command_status(cmd)
 | 
			
		||||
                print output
 | 
			
		||||
                print(output)
 | 
			
		||||
 | 
			
		||||
        if options.finish and not options.dry and status == 0:
 | 
			
		||||
            status = finish_branch(branch)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								setup.py
									
									
									
									
									
								
							@@ -21,7 +21,7 @@ from setuptools.command.install import install
 | 
			
		||||
# version comes from git-review.
 | 
			
		||||
savename = __name__
 | 
			
		||||
__name__ = "not-main"
 | 
			
		||||
exec(open("git-review", "r"))
 | 
			
		||||
exec(open("git-review").read())
 | 
			
		||||
__name__ = savename
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -40,7 +40,10 @@ setup(
 | 
			
		||||
    cmdclass=git_review_cmdclass,
 | 
			
		||||
    description="Tool to submit code to Gerrit",
 | 
			
		||||
    license='Apache License (2.0)',
 | 
			
		||||
    classifiers=["Programming Language :: Python"],
 | 
			
		||||
    classifiers=[
 | 
			
		||||
            "Programming Language :: Python :: 2",
 | 
			
		||||
            "Programming Language :: Python :: 3",
 | 
			
		||||
        ],
 | 
			
		||||
    keywords='git gerrit review',
 | 
			
		||||
    author='OpenStack, LLC.',
 | 
			
		||||
    author_email='openstack@lists.launchpad.net',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user