From 0b16cbb8c4da3aa0362e0fa1e76fc40b5cc1b7e1 Mon Sep 17 00:00:00 2001
From: David Stanek <dstanek@dstanek.com>
Date: Sun, 12 Apr 2015 15:23:50 -0400
Subject: [PATCH] Refactor: move getRepo out of the App object

The getRepo method really doesn't have much to do with the application
object. Since it's really a utiltiy method for dealing with git repos
I've moved it to gertty.gitrepo.

Change-Id: Ic3349430c456ee184bbf57b6e5b7de4f940b4cc1
---
 gertty/app.py         | 11 ++---------
 gertty/gitrepo.py     |  6 ++++++
 gertty/sync.py        |  6 +++---
 gertty/view/change.py |  5 +++--
 gertty/view/diff.py   |  3 ++-
 5 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/gertty/app.py b/gertty/app.py
index 37e3e55..47f90ba 100644
--- a/gertty/app.py
+++ b/gertty/app.py
@@ -522,13 +522,6 @@ class App(object):
             view = view_change_list.ChangeListView(self, d['query'], d['name'])
             self.changeScreen(view)
 
-    def getRepo(self, project_name):
-        local_path = os.path.join(self.config.git_root, project_name)
-        local_root = os.path.abspath(self.config.git_root)
-        assert os.path.commonprefix((local_root, local_path)) == local_root
-        return gitrepo.Repo(self.config.url+'p/'+project_name,
-                            local_path)
-
     def openURL(self, url):
         self.log.debug("Open URL %s" % url)
         webbrowser.open_new_tab(url)
@@ -578,7 +571,7 @@ class App(object):
         return ret
 
     def localCheckoutCommit(self, project_name, commit_sha):
-        repo = self.getRepo(project_name)
+        repo = gitrepo.get_repo(project_name, self.config)
         try:
             repo.checkout(commit_sha)
             dialog = mywid.MessageDialog('Checkout', 'Change checked out in %s' % repo.path)
@@ -591,7 +584,7 @@ class App(object):
         self.popup(dialog, min_height=min_height)
 
     def localCherryPickCommit(self, project_name, commit_sha):
-        repo = self.getRepo(project_name)
+        repo = gitrepo.get_repo(project_name, self.config)
         try:
             repo.cherryPick(commit_sha)
             dialog = mywid.MessageDialog('Cherry-Pick', 'Change cherry-picked in %s' % repo.path)
diff --git a/gertty/gitrepo.py b/gertty/gitrepo.py
index 62d5ba2..59e4616 100644
--- a/gertty/gitrepo.py
+++ b/gertty/gitrepo.py
@@ -507,3 +507,9 @@ class Repo(object):
             f.addContextLine(line)
         f.finalize()
         return f
+
+def get_repo(project_name, config):
+    local_path = os.path.join(config.git_root, project_name)
+    local_root = os.path.abspath(config.git_root)
+    assert os.path.commonprefix((local_root, local_path)) == local_root
+    return Repo(config.url+'p/'+project_name, local_path)
diff --git a/gertty/sync.py b/gertty/sync.py
index 1735cd2..346165a 100644
--- a/gertty/sync.py
+++ b/gertty/sync.py
@@ -567,7 +567,7 @@ class SyncChangeTask(Task):
             change.subject = remote_change['subject']
             change.updated = dateutil.parser.parse(remote_change['updated'])
             change.topic = remote_change.get('topic')
-            repo = app.getRepo(change.project.name)
+            repo = gertty.gitrepo.get_repo(change.project.name, app.config)
             new_revision = False
             for remote_commit, remote_revision in remote_change.get('revisions', {}).items():
                 revision = session.getRevisionByCommit(remote_commit)
@@ -847,7 +847,7 @@ class CheckReposTask(Task):
             try:
                 missing = False
                 try:
-                    app.getRepo(project.name)
+                    repo = gertty.gitrepo.get_repo(project.name, app.config)
                 except gitrepo.GitCloneError:
                     missing = True
                 if missing or app.fetch_missing_refs:
@@ -878,7 +878,7 @@ class CheckRevisionsTask(Task):
             project = session.getProject(self.project_key)
             repo = None
             try:
-                repo = app.getRepo(project.name)
+                repo = gitrepo.get_repo(project.name, app.config)
             except gitrepo.GitCloneError:
                 pass
             for change in project.open_changes:
diff --git a/gertty/view/change.py b/gertty/view/change.py
index 7f401df..7c89964 100644
--- a/gertty/view/change.py
+++ b/gertty/view/change.py
@@ -19,6 +19,7 @@ import urlparse
 
 import urwid
 
+from gertty import gitrepo
 from gertty import keymap
 from gertty import mywid
 from gertty import sync
@@ -504,7 +505,7 @@ class ChangeView(urwid.WidgetWrap):
             change = session.getChange(self.change_key)
             change_number = change.number
             change_id = change.id
-            repo = self.app.getRepo(change.project.name)
+            repo = gitrepo.get_repo(change.project.name, self.app.config)
             for revision in change.revisions:
                 if not repo.hasCommit(revision.parent):
                     missing_revisions.add(revision.parent)
@@ -626,7 +627,7 @@ class ChangeView(urwid.WidgetWrap):
 
             self.refreshDependencies(session, change)
 
-            repo = self.app.getRepo(change.project.name)
+            repo = gitrepo.get_repo(change.project.name, self.app.config)
             # The listbox has both revisions and messages in it (and
             # may later contain the vote table and change header), so
             # keep track of the index separate from the loop.
diff --git a/gertty/view/diff.py b/gertty/view/diff.py
index 3150bb0..976445a 100644
--- a/gertty/view/diff.py
+++ b/gertty/view/diff.py
@@ -17,6 +17,7 @@ import logging
 
 import urwid
 
+from gertty import gitrepo
 from gertty import keymap
 from gertty import mywid
 from gertty import gitrepo
@@ -252,7 +253,7 @@ class BaseDiffView(urwid.WidgetWrap):
                 comment_list.append((comment.key, message))
                 comment_lists[key] = comment_list
                 comment_filenames.add(path)
-        repo = self.app.getRepo(self.project_name)
+        repo = gitrepo.get_repo(self.project_name, self.app.config)
         self._w.contents.append((self.app.header, ('pack', 1)))
         self.file_reminder = self.makeFileReminder()
         self._w.contents.append((self.file_reminder, ('pack', 1)))