From 054c835bea0d2e071d6ffe84ece1f4b41b74dfeb Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 18:12:21 -0500 Subject: [PATCH 01/10] Fixed requirements. The repositories did not exist anymore --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5104aad..ccf0794 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ --e git+git://github.com/defunkt/pygments.git#egg=pygments --e git+git://github.com/mm/gitpython.git#egg=gitpython +Pygments +gitpython From 84eb0dec173febe40de1565ea89121ba69526d20 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 18:47:38 -0500 Subject: [PATCH 02/10] Template filter to parse and render a repository path now fixed --- django_git/templates/django_git/commit.html | 4 ++-- django_git/templates/django_git/index.html | 4 ++-- django_git/templates/django_git/repo.html | 6 +++--- django_git/templatetags/repositories.py | 15 +++++++++++---- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/django_git/templates/django_git/commit.html b/django_git/templates/django_git/commit.html index 4615a2f..55100d4 100644 --- a/django_git/templates/django_git/commit.html +++ b/django_git/templates/django_git/commit.html @@ -9,7 +9,7 @@ {% endblock %} {% block title %} - {{ repo.path|name }} : {{ commit|first_eight }} + {{ repo.path|path2title }} : {{ commit|first_eight }} {% endblock %} {% block main_content %} @@ -32,4 +32,4 @@ {% else %}

No diff information.

{% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_git/templates/django_git/index.html b/django_git/templates/django_git/index.html index 0c68c7f..f56f1ed 100644 --- a/django_git/templates/django_git/index.html +++ b/django_git/templates/django_git/index.html @@ -15,10 +15,10 @@ {% for repo in repos %} - {{ repo.path|name }} + {{ repo.path|path2title }} {{ repo.commits.0.message }} {{ repo.commits.0.author.name }} {% endfor %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_git/templates/django_git/repo.html b/django_git/templates/django_git/repo.html index 535ad43..924a24d 100644 --- a/django_git/templates/django_git/repo.html +++ b/django_git/templates/django_git/repo.html @@ -3,7 +3,7 @@ {% load repositories %} {% block title %} - {{ repo.path|name }} + {{ repo.path|path2title }} {% endblock %} {% block main_content %} @@ -16,7 +16,7 @@ {% for commit in repo.commits %} - {{ commit|first_eight }} + {{ commit|first_eight }} {{ commit.message }} {{ commit.committer.name }} {{ commit.committed_date|tuple_to_date|date:"m/d/Y" }} @@ -32,4 +32,4 @@

Heads

{% endfor %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django_git/templatetags/repositories.py b/django_git/templatetags/repositories.py index 5b9ddb2..6a18111 100644 --- a/django_git/templatetags/repositories.py +++ b/django_git/templatetags/repositories.py @@ -1,12 +1,19 @@ from datetime import datetime import os +import os.path from django import template register = template.Library() -@register.filter("name") -def name(value): - return value.split(os.sep)[-2] +@register.filter("path2title") +def path2title(path): + """Returns the title case of a path + + >> path2title('/Users/mark/derp.git') + ... derp + + """ + return os.path.basename(path).split('.')[0] @register.filter("first_eight") def first_eight(value): @@ -14,4 +21,4 @@ def first_eight(value): @register.filter("tuple_to_date") def tuple_to_date(value): - return datetime(value[0], value[1], value[2], value[3], value[4], value[5], value[6]) \ No newline at end of file + return datetime(value[0], value[1], value[2], value[3], value[4], value[5], value[6]) From f5a38171ded4fb58ed8585101c77fffe04be4901 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 19:06:34 -0500 Subject: [PATCH 03/10] Passed in the the official variable name --- django_git/templatetags/repositories.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_git/templatetags/repositories.py b/django_git/templatetags/repositories.py index 6a18111..c0d1ec0 100644 --- a/django_git/templatetags/repositories.py +++ b/django_git/templatetags/repositories.py @@ -6,14 +6,14 @@ register = template.Library() @register.filter("path2title") -def path2title(path): +def path2title(value): """Returns the title case of a path >> path2title('/Users/mark/derp.git') ... derp """ - return os.path.basename(path).split('.')[0] + return os.path.basename(value).split('.')[0] @register.filter("first_eight") def first_eight(value): From afb8cbd01fd20833954e76e572a2c19186d72621 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 19:51:18 -0500 Subject: [PATCH 04/10] Using quoted url for reverse --- django_git/templates/django_git/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_git/templates/django_git/index.html b/django_git/templates/django_git/index.html index f56f1ed..5a40dc3 100644 --- a/django_git/templates/django_git/index.html +++ b/django_git/templates/django_git/index.html @@ -15,7 +15,7 @@ {% for repo in repos %} - {{ repo.path|path2title }} + {{ repo.path|path2title }} {{ repo.commits.0.message }} {{ repo.commits.0.author.name }} From 7c232f785fd3aca6eaf4dab3d68ca70786176f4a Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 23:38:39 -0500 Subject: [PATCH 05/10] example added --- example/__init__.py | 0 example/manage.py | 10 +++ example/settings.py | 163 ++++++++++++++++++++++++++++++++++++ example/templates/base.html | 10 +++ example/urls.py | 20 +++++ example/wsgi.py | 28 +++++++ 6 files changed, 231 insertions(+) create mode 100644 example/__init__.py create mode 100755 example/manage.py create mode 100644 example/settings.py create mode 100644 example/templates/base.html create mode 100644 example/urls.py create mode 100644 example/wsgi.py diff --git a/example/__init__.py b/example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example/manage.py b/example/manage.py new file mode 100755 index 0000000..f9726f9 --- /dev/null +++ b/example/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/example/settings.py b/example/settings.py new file mode 100644 index 0000000..cab5ff2 --- /dev/null +++ b/example/settings.py @@ -0,0 +1,163 @@ +# Django settings for example project. +import os.path + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': '', # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'America/Chicago' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale. +USE_L10N = True + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/home/media/media.lawrence.com/media/" +MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media') + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash. +# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" +MEDIA_URL = '/media/' + +# Absolute path to the directory static files should be collected to. +# Don't put anything in this directory yourself; store your static files +# in apps' "static/" subdirectories and in STATICFILES_DIRS. +# Example: "/home/media/media.lawrence.com/static/" +STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') + +# URL prefix for static files. +# Example: "http://media.lawrence.com/static/" +STATIC_URL = '/static/' + +# Additional locations of static files +STATICFILES_DIRS = ( + # Put strings here, like "/home/html/static" or "C:/www/django/static". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. +) + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +# 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = '#uzwpnjyt9@a0=ghhqv_4m2bo_j_74-tprd67hkg3u))$=*j4i' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + # Uncomment the next line for simple clickjacking protection: + # 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + os.path.join(PROJECT_ROOT, 'templates'), +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # Uncomment the next line to enable the admin: + # 'django.contrib.admin', + # Uncomment the next line to enable admin documentation: + # 'django.contrib.admindocs', + + 'django_git', +) + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +## DJANGO-GIT SETTINGS +REPOS_ROOT = os.path.expanduser('~/Projects/') diff --git a/example/templates/base.html b/example/templates/base.html new file mode 100644 index 0000000..336ea44 --- /dev/null +++ b/example/templates/base.html @@ -0,0 +1,10 @@ + + + + Django Git Tester|{% block title %}{% endblock title %} + {% block extra_head %}{% endblock extra_head %} + + + {% block main_content %}{% endblock main_content %} + + diff --git a/example/urls.py b/example/urls.py new file mode 100644 index 0000000..0be5c45 --- /dev/null +++ b/example/urls.py @@ -0,0 +1,20 @@ +from django.conf.urls import patterns, include, url + +# Uncomment the next two lines to enable the admin: +# from django.contrib import admin +# admin.autodiscover() + +urlpatterns = patterns('', + # Examples: + # url(r'^$', 'example.views.home', name='home'), + # url(r'^example/', include('example.foo.urls')), + + # Uncomment the admin/doc line below to enable admin documentation: + # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), + + # Uncomment the next line to enable the admin: + # url(r'^admin/', include(admin.site.urls)), + + url(r'^git/', include('django_git.urls')), +) + diff --git a/example/wsgi.py b/example/wsgi.py new file mode 100644 index 0000000..e3cde02 --- /dev/null +++ b/example/wsgi.py @@ -0,0 +1,28 @@ +""" +WSGI config for example project. + +This module contains the WSGI application used by Django's development server +and any production WSGI deployments. It should expose a module-level variable +named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover +this application via the ``WSGI_APPLICATION`` setting. + +Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework. + +""" +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +# Apply WSGI middleware here. +# from helloworld.wsgi import HelloWorldApplication +# application = HelloWorldApplication(application) From b35bb7962f83a1aa3886297c5d4f576656772a40 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 23:39:30 -0500 Subject: [PATCH 06/10] updated repos to use working_dir as their path. i suppose the old version was referring to a deprecated pygit function --- django_git/templates/django_git/commit.html | 2 +- django_git/templates/django_git/index.html | 2 +- django_git/templates/django_git/repo.html | 4 ++-- django_git/templatetags/repositories.py | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/django_git/templates/django_git/commit.html b/django_git/templates/django_git/commit.html index 55100d4..6c43a38 100644 --- a/django_git/templates/django_git/commit.html +++ b/django_git/templates/django_git/commit.html @@ -9,7 +9,7 @@ {% endblock %} {% block title %} - {{ repo.path|path2title }} : {{ commit|first_eight }} + {{ repo.working_dir|path_into_title }} : {{ commit|first_eight }} {% endblock %} {% block main_content %} diff --git a/django_git/templates/django_git/index.html b/django_git/templates/django_git/index.html index 5a40dc3..57f4a9a 100644 --- a/django_git/templates/django_git/index.html +++ b/django_git/templates/django_git/index.html @@ -15,7 +15,7 @@ {% for repo in repos %} - {{ repo.path|path2title }} + {{ repo.working_dir|path_into_title }} {{ repo.commits.0.message }} {{ repo.commits.0.author.name }} diff --git a/django_git/templates/django_git/repo.html b/django_git/templates/django_git/repo.html index 924a24d..cce600e 100644 --- a/django_git/templates/django_git/repo.html +++ b/django_git/templates/django_git/repo.html @@ -3,7 +3,7 @@ {% load repositories %} {% block title %} - {{ repo.path|path2title }} + {{ repo.working_dir|path_into_title }} {% endblock %} {% block main_content %} @@ -16,7 +16,7 @@ {% for commit in repo.commits %} - {{ commit|first_eight }} + {{ commit|first_eight }} {{ commit.message }} {{ commit.committer.name }} {{ commit.committed_date|tuple_to_date|date:"m/d/Y" }} diff --git a/django_git/templatetags/repositories.py b/django_git/templatetags/repositories.py index c0d1ec0..272cef6 100644 --- a/django_git/templatetags/repositories.py +++ b/django_git/templatetags/repositories.py @@ -5,15 +5,15 @@ from django import template register = template.Library() -@register.filter("path2title") -def path2title(value): +@register.filter("path_into_title") +def path_into_title(value): """Returns the title case of a path >> path2title('/Users/mark/derp.git') ... derp """ - return os.path.basename(value).split('.')[0] + return value.split(os.sep)[-1] @register.filter("first_eight") def first_eight(value): From 8ac8a8f071f0e54663384ec27aa42e410ecd1a50 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Wed, 23 May 2012 23:44:11 -0500 Subject: [PATCH 07/10] README updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 818548f..ce31d8a 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Requirements * GitPython * Django 1.3 (alpha or better) -If you would like to get started with django-git [Hugh Brown](http://github.com/hughdbrown) has created [Django-git-tester](http://github.com/hughdbrown/Django-git-tester). +If you would like to get started with django-git there is an basic project in example/ . Thanks! ------- From 5d4e8b79625f576d30d057712bc09b0518a4e1ec Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Thu, 24 May 2012 00:12:45 -0500 Subject: [PATCH 08/10] There were a lot of changes from gitpython 2 to 3, the setup.py should refer to the latest one --- dist/django_git-0.1-py2.7.egg | Bin 0 -> 11784 bytes setup.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 dist/django_git-0.1-py2.7.egg diff --git a/dist/django_git-0.1-py2.7.egg b/dist/django_git-0.1-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..4a46fc51450bd8da95faaf4a745e8e82b5418068 GIT binary patch literal 11784 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 r{0;jkKYR*)nixEQgDL<2;D=0.1.4', 'Pygments >=0.11'], + install_requires=['GitPython >=0.3', 'Pygments >=0.11'], ) From 4190316fae166fd8bdfb86a99c949f9415daba4e Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Thu, 24 May 2012 00:16:32 -0500 Subject: [PATCH 09/10] Ignore dist when developing --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3224484..8fbdbfa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.pyc *.kpf django_git.egg-info +dist/ From 012af0c36a4d24a8c7ee5c9158e01c59d7cf8e74 Mon Sep 17 00:00:00 2001 From: Mark Feltner Date: Thu, 24 May 2012 00:16:44 -0500 Subject: [PATCH 10/10] Ignore dist when developing --- dist/django_git-0.1-py2.7.egg | Bin 11784 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dist/django_git-0.1-py2.7.egg diff --git a/dist/django_git-0.1-py2.7.egg b/dist/django_git-0.1-py2.7.egg deleted file mode 100644 index 4a46fc51450bd8da95faaf4a745e8e82b5418068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11784 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 r{0;jkKYR*)nixEQgDL<2;D