Merge pull request #158 from gazpachoking/no_gittle

Remove gittle dependency and use dulwich directly
This commit is contained in:
Chase Sterling 2016-08-09 01:18:17 -04:00 committed by GitHub
commit 4a38e896eb
3 changed files with 15 additions and 32 deletions

View file

@ -2,11 +2,9 @@ import os
import posixpath import posixpath
import re import re
import ghdiff import ghdiff
import gittle.utils
import yaml import yaml
from gittle import Gittle
from dulwich.object_store import tree_lookup_path from dulwich.object_store import tree_lookup_path
from dulwich.repo import NotGitRepository from dulwich.repo import Repo, NotGitRepository
from realms.lib.util import cname_to_filename, filename_to_cname from realms.lib.util import cname_to_filename, filename_to_cname
from realms import cache from realms import cache
from realms.lib.hook import HookMixin from realms.lib.hook import HookMixin
@ -23,17 +21,13 @@ class Wiki(HookMixin):
default_committer_name = 'Anon' default_committer_name = 'Anon'
default_committer_email = 'anon@anon.anon' default_committer_email = 'anon@anon.anon'
index_page = 'home' index_page = 'home'
gittle = None
repo = None repo = None
def __init__(self, path): def __init__(self, path):
try: try:
self.gittle = Gittle(path) self.repo = Repo(path)
except NotGitRepository: except NotGitRepository:
self.gittle = Gittle.init(path) self.repo = Repo.init(path, mkdir=True)
# Dulwich repo
self.repo = self.gittle.repo
self.path = path self.path = path
@ -46,20 +40,20 @@ class Wiki(HookMixin):
:param name: Committer name :param name: Committer name
:param email: Committer email :param email: Committer email
:param message: Commit message :param message: Commit message
:param files: list of file names that should be committed :param files: list of file names that will be staged for commit
:return: :return:
""" """
# Dulwich and gittle seem to want us to encode ourselves at the moment. see #152
if isinstance(name, unicode): if isinstance(name, unicode):
name = name.encode('utf-8') name = name.encode('utf-8')
if isinstance(email, unicode): if isinstance(email, unicode):
email = email.encode('utf-8') email = email.encode('utf-8')
if isinstance(message, unicode): if isinstance(message, unicode):
message = message.encode('utf-8') message = message.encode('utf-8')
return self.gittle.commit(name=name, author = committer = "%s <%s>" % (name, email)
email=email, self.repo.stage(files)
message=message, return self.repo.do_commit(message=message,
files=files) committer=committer,
author=author)
def get_page(self, name, sha='HEAD'): def get_page(self, name, sha='HEAD'):
"""Get page data, partials, commit info. """Get page data, partials, commit info.
@ -104,7 +98,8 @@ class WikiPage(HookMixin):
if cached: if cached:
return cached return cached
data = self.wiki.gittle.get_commit_files(self.sha, paths=[self.filename]).get(self.filename).get('data') mode, sha = tree_lookup_path(self.wiki.repo.get_object, self.wiki.repo[self.sha].tree, self.filename)
data = self.wiki.repo[sha].data
cache.set(cache_key, data) cache.set(cache_key, data)
return data return data
@ -257,9 +252,7 @@ class WikiPage(HookMixin):
if not message: if not message:
message = "Deleted %s" % self.name message = "Deleted %s" % self.name
# gittle.rm won't actually remove the file, have to do it ourselves
os.remove(os.path.join(self.wiki.path, self.filename)) os.remove(os.path.join(self.wiki.path, self.filename))
self.wiki.gittle.rm(self.filename)
commit = self.wiki.commit(name=username, commit = self.wiki.commit(name=username,
email=email, email=email,
message=message, message=message,
@ -278,7 +271,7 @@ class WikiPage(HookMixin):
""" """
assert self.sha == 'HEAD' assert self.sha == 'HEAD'
old_filename, new_filename = self.filename, cname_to_filename(new_name) old_filename, new_filename = self.filename, cname_to_filename(new_name)
if old_filename not in self.wiki.gittle.index: if old_filename not in self.wiki.repo.open_index():
# old doesn't exist # old doesn't exist
return None return None
elif old_filename == new_filename: elif old_filename == new_filename:
@ -293,10 +286,6 @@ class WikiPage(HookMixin):
message = "Moved %s to %s" % (self.name, new_name) message = "Moved %s to %s" % (self.name, new_name)
os.rename(os.path.join(self.wiki.path, old_filename), os.path.join(self.wiki.path, new_filename)) os.rename(os.path.join(self.wiki.path, old_filename), os.path.join(self.wiki.path, new_filename))
self.wiki.gittle.add(new_filename)
self.wiki.gittle.rm(old_filename)
commit = self.wiki.commit(name=username, commit = self.wiki.commit(name=username,
email=email, email=email,
message=message, message=message,
@ -311,12 +300,11 @@ class WikiPage(HookMixin):
return commit return commit
def write(self, content, message=None, create=False, username=None, email=None): def write(self, content, message=None, username=None, email=None):
"""Write page to git repo """Write page to git repo
:param content: Content of page. :param content: Content of page.
:param message: Commit message. :param message: Commit message.
:param create: Perform git add operation?
:param username: Commit Name. :param username: Commit Name.
:param email: Commit Email. :param email: Commit Email.
:return: Git commit sha1. :return: Git commit sha1.
@ -330,9 +318,6 @@ class WikiPage(HookMixin):
with open(self.wiki.path + "/" + self.filename, 'w') as f: with open(self.wiki.path + "/" + self.filename, 'w') as f:
f.write(content) f.write(content)
if create:
self.wiki.gittle.add(self.filename)
if not message: if not message:
message = "Updated %s" % self.name message = "Updated %s" % self.name
@ -363,8 +348,7 @@ class WikiPage(HookMixin):
raise PageNotFound('Commit not found') raise PageNotFound('Commit not found')
if not message: if not message:
commit_info = gittle.utils.git.commit_info(self.wiki.gittle[commit_sha.encode('latin-1')]) message = "Revert '%s' to %s" % (self.name, commit_sha[:7])
message = commit_info['message']
return self.write(new_page.data, message=message, username=username, email=email) return self.write(new_page.data, message=message, username=username, email=email)

View file

@ -196,7 +196,6 @@ def page_write(name):
sha = g.current_wiki.get_page(cname).write(request.form['content'], sha = g.current_wiki.get_page(cname).write(request.form['content'],
message=request.form['message'], message=request.form['message'],
create=True,
username=current_user.username, username=current_user.username,
email=current_user.email) email=current_user.email)

View file

@ -35,10 +35,10 @@ setup(name='realms-wiki',
'bcrypt==1.0.2', 'bcrypt==1.0.2',
'beautifulsoup4==4.3.2', 'beautifulsoup4==4.3.2',
'click==3.3', 'click==3.3',
'dulwich==0.14.1',
'flask-ldap-login==0.3.0', 'flask-ldap-login==0.3.0',
'gevent==1.0.2', 'gevent==1.0.2',
'ghdiff==0.4', 'ghdiff==0.4',
'gittle==0.5.0',
'gunicorn==19.3', 'gunicorn==19.3',
'itsdangerous==0.24', 'itsdangerous==0.24',
'markdown2==2.3.1', 'markdown2==2.3.1',