Switch scm client discovery to entry points

Review Request #4145 — Created May 13, 2013 and submitted

Information

RBTools
master

Reviewers

Switch scm client discovery to entry points.

SCM Clients will now be discovered using entry points, instead of a
hardcoded list. This will allow third party packages to provide
support for additional clients.

Additionally, a '--repository-type' option has been added to all of
the rbt commands and post-review. This option allows the user to
specify a particular repository type, which the working directory will
be checked for before other repository types.

The valid repository types can be printed using the new
'--list-repository-types' option to post-review, or by invoking the
new 'rbt list-repo-types' command.
Used the --repository-type option and confirmed the provided type was
being checked initially (By observing the debug messages).
Description From Last Updated

Blank line.

chipx86chipx86

We should catch any exceptions and log.

chipx86chipx86

We duplicate so many of these. Maybe we should have a file where we define common options. Either way, above …

chipx86chipx86

Same here as above. This is a bit long. Maybe leave off the valid types, and instead add a --list-repository-types …

chipx86chipx86

I think this can be compacted a bit to prevent multiple places looking for repo info. How about: if client_name: …

chipx86chipx86

Would prefer this be spread across 3 lines, like: scmclients = { client_name: ..., }

chipx86chipx86

Can do elif/else here.

chipx86chipx86

I'd like to use single quotes instead of double where possible. It's cleaner-looking.

chipx86chipx86

Indentation error.

chipx86chipx86
reviewbot
  1. This is a review from Review Bot.
      Tool: PEP8 Style Checker
      Processed Files:
        rbtools/commands/status.py
        rbtools/postreview.py
        rbtools/commands/post.py
        rbtools/commands/__init__.py
        rbtools/commands/diff.py
        rbtools/commands/patch.py
        rbtools/clients/__init__.py
        rbtools/commands/attach.py
        rbtools/commands/publish.py
        setup.py
        rbtools/commands/close.py
      Ignored Files:
        docs/rbtools/rbt/commands/status.txt
        docs/rbtools/rbt/commands/patch.txt
        docs/rbtools/rbt/commands/diff.txt
        docs/rbtools/rbt/commands/close.txt
        docs/rbtools/rbt/commands/post.txt
        docs/rbtools/rbt/commands/publish.txt
        docs/rbtools/rbt/commands/attach.txt
        docs/rbtools/post-review.txt
    
    
  2. 
      
chipx86
  1. 
      
  2. docs/rbtools/post-review.txt (Diff revision 1)
     
     
    Comma before "but".
  3. docs/rbtools/post-review.txt (Diff revision 1)
     
     
     
    I'd put a colon after "include", and maybe ``..`` around each type.
    
    This and the previous apply to all other docs.
  4. rbtools/postreview.py (Diff revision 1)
     
     
     
     
     
     
    Show all issues
    Same here as above.
    
    This is a bit long. Maybe leave off the valid types, and instead add a --list-repository-types option for listing them.
    1. I'm going to add that option for post-review, but instead of adding that logic to every rbt command that takes --repository-type, I'm just going to add a simple 'rbt list-repo-types'.
  5. 
      
chipx86
  1. 
      
  2. rbtools/clients/__init__.py (Diff revision 1)
     
     
     
    Show all issues
    Blank line.
  3. rbtools/clients/__init__.py (Diff revision 1)
     
     
    Show all issues
    We should catch any exceptions and log.
  4. rbtools/clients/__init__.py (Diff revision 1)
     
     
     
     
     
     
     
    My feeling is that if they specify a type, and it doesn't match, we shouldn't try anything else. Otherwise, we might hit some parent directory's matched repository, or the global $P4PORT-based repo info for Perforce.
    1. Sounds good. I couldn't decide if having the fall back autodetection was a good idea
      or not, so I just went with it arbitrarily.
  5. rbtools/commands/attach.py (Diff revision 1)
     
     
     
     
     
     
     
     
    Show all issues
    We duplicate so many of these. Maybe we should have a file where we define common options.
    
    Either way, above comments apply to this and other help strings.
    1. Yeah, that's on the roadmap. I'm going to consolidate the options into
      different functional groups (e.g. Server options, SCM Options, etc.)
      and allow the commands to grab the common options they need (so if they
      talk to the SCM, they need the SCM options). I'm going to leave that out
      of this change though.
  6. 
      
SM
reviewbot
  1. This is a review from Review Bot.
      Tool: PEP8 Style Checker
      Processed Files:
        rbtools/commands/status.py
        rbtools/postreview.py
        rbtools/commands/post.py
        rbtools/commands/__init__.py
        rbtools/commands/diff.py
        rbtools/commands/patch.py
        rbtools/clients/__init__.py
        rbtools/commands/attach.py
        rbtools/commands/publish.py
        setup.py
        rbtools/commands/close.py
        rbtools/commands/list_repo_types.py
      Ignored Files:
        docs/rbtools/rbt/commands/attach.txt
        docs/rbtools/rbt/commands/status.txt
        docs/rbtools/rbt/commands/patch.txt
        docs/rbtools/rbt/commands/diff.txt
        docs/rbtools/rbt/commands/close.txt
        docs/rbtools/rbt/commands/list-repo-types.txt
        docs/rbtools/rbt/commands/post.txt
        docs/rbtools/rbt/commands/publish.txt
        docs/rbtools/rbt/commands/index.txt
        docs/rbtools/post-review.txt
    
    
  2. 
      
chipx86
  1. 
      
  2. rbtools/clients/__init__.py (Diff revision 2)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    Show all issues
    I think this can be compacted a bit to prevent multiple places looking for repo info. How about:
    
    if client_name:
        if client_name not in SCMCLIENTS:
            logging.error('The provided ... is invalid')
            sys.exit(1)
        else:
            scmclients = [client_name]
    else:
        scmclients = SCMCLIENTS
    
    for name, tool in scmclients.iteritems():
        ...
    
    if not repository.info:
        if client_name:
            logging.error('The provided repository type ...')
    
        ...
    1. Much nicer, thanks
  3. rbtools/commands/list_repo_types.py (Diff revision 2)
     
     
     
     
    Show all issues
    I'd like to use single quotes instead of double where possible. It's cleaner-looking.
  4. rbtools/commands/list_repo_types.py (Diff revision 2)
     
     
    Show all issues
    Indentation error.
  5. 
      
SM
reviewbot
  1. This is a review from Review Bot.
      Tool: PEP8 Style Checker
      Processed Files:
        rbtools/commands/status.py
        rbtools/postreview.py
        rbtools/commands/post.py
        rbtools/commands/__init__.py
        rbtools/commands/diff.py
        rbtools/commands/patch.py
        rbtools/clients/__init__.py
        rbtools/commands/attach.py
        rbtools/commands/publish.py
        setup.py
        rbtools/commands/close.py
        rbtools/commands/list_repo_types.py
      Ignored Files:
        docs/rbtools/rbt/commands/attach.txt
        docs/rbtools/rbt/commands/status.txt
        docs/rbtools/rbt/commands/patch.txt
        docs/rbtools/rbt/commands/diff.txt
        docs/rbtools/rbt/commands/close.txt
        docs/rbtools/rbt/commands/list-repo-types.txt
        docs/rbtools/rbt/commands/post.txt
        docs/rbtools/rbt/commands/publish.txt
        docs/rbtools/rbt/commands/index.txt
        docs/rbtools/post-review.txt
    
    
  2. 
      
chipx86
  1. Only two small things, then ship it!
  2. rbtools/clients/__init__.py (Diff revisions 2 - 3)
     
     
    Show all issues
    Would prefer this be spread across 3 lines, like:
    
    scmclients = {
       client_name: ...,
    }
  3. rbtools/clients/__init__.py (Diff revisions 2 - 3)
     
     
     
     
     
     
     
     
    Show all issues
    Can do elif/else here.
  4. 
      
SM
Review request changed
Status:
Completed
Change Summary:
Pushed to master, release-0.5.x (4524ef3c1f09c44f7bd8dab78ed171f42adebd72)