1. Skip to navigation
  2. Skip to content

Entries tagged “python”

GitPython Release 0.1.6

written by Michael Trier, on Jan 24, 2009 9:33:00 PM.

I just released GitPython version 0.1.6. This version has some backwards incompatible changes to be sure to read through the changes below before upgrading.

GitPython is a python library that makes it easy to interact with Git repositories. The emphasis so far has been on introspection and less on manipulation, although some manipulation level functionality is present. For a good tutorial on getting started, check out the source distribution documentation files.

This version includes Sphinxification of the documentation. If you haven’t worked with Sphinx yet, I highly recommend it for documenting your projects. I just touched the surface with it and I was really amazed on the “out-of-the-box” functionality.

I hope you enjoy GitPython.

CHANGES

General

  • Added in Sphinx documentation.
  • Removed ambiguity between paths and treeishs. When calling commands that accept treeish and path arguments and there is a path with the same name as a treeish git cowardly refuses to pick one and asks for the command to use the unambiguous syntax where ’—’ seperates the treeish from the paths.
  • Repo.commits, Repo.commits_between, Reop.commits_since, Repo.commit_count, Repo.commit, Commit.count and Commit.find_all all now optionally take a path argument which constrains the lookup by path. This changes the order of the positional arguments in Repo.commits and Repo.commits_since.

Commit

  • Commit.message now contains the full commit message (rather than just the first line) and a new property Commit.summary contains the first line of the commit message.
  • Fixed a failure when trying to lookup the stats of a parentless commit from a bare repo.

Diff

  • The diff parser is now far faster and also addresses a bug where sometimes b_mode was not set.
  • Added support for parsing rename info to the diff parser. Addition of new properties Diff.renamed, Diff.rename_from, and Diff.rename_to.

Head

  • Corrected problem where branches was only returning the last path component instead of the entire path component following refs/heads/.

Repo

  • Modified the gzip archive creation to use the python gzip module.
  • Corrected commits_between always returning None instead of the reversed list.

Django Docs Refactor

written by Michael Trier, on Aug 23, 2008 6:40:00 PM.

Django documentation has been refactored (Changeset 8506) using the excellent Sphinx – Python documentation generator. This is the same package used to generate the new Python documentation Check out the new docs at http://docs.djangoproject.com/. Now I have to go and update all my shortcut snippets. Thanks go especially to Jacob Kaplan-Moss and numerous contributors for all of their hard work on this one.

GitPython Ported to FreeBSD

written by Michael Trier, on Jul 24, 2008 2:50:00 PM.

Wen Heping submitted a port of GitPython to be included with FreeBSD. It has been great to see all the people that have taken interest in GitPython and have worked to support the project.

This Week in Django 30 - 2008-07-20

written by Michael Trier, on Jul 21, 2008 11:54:00 PM.

This Week in Django is a weekly podcast about all things Django.

This week we discuss the NewForms-Admin merge into Trunk, DjangoCon, a few source commits, some cool projects from the community, and the Tip of the Week.

Please see the Show Notes below for all the pertinent information and links

Downloads

AAC Enhanced Podcast (41.8 MB, 49:31, AAC)

MP3 Edition (34.1 MB, 49:31, MP3)

OGG Edition (27.9 MB, 49:31, Vorbis)

The Enhanced Podcast version contains screenshots and easy access links to all of the items we discuss throughout the podcast.

Feeds Available

iTunes Feeds are available. By subscribing using the iTunes feeds the podcasts will automatically be downloaded for you when we release them.

iTunes Feeds

This Week in Django – AAC Edition

This Week in Django – MP3 Edition

Regular RSS Feeds

This Week in Django – AAC Edition

This Week in Django – MP3 Edition

This Week in Django – OGG Edition

Give Us Feedback

Want to give us some feedback on the show? We’re always looking for ideas or suggestions that will help improve each episode. Please contact us at feedback __at__ thisweekindjango.com.

Show Notes

Big News (0:47)

Tracking Trunk (15:04)

Community Catchup (26:16)

  • Kevin Fricovsky – joins the This Week in Django team as Community Evangelist. Kevin will be working to produce the show, contacting guests, gathering news items, coming up with ideas. Kevin has been doing this work regularly anyway so it’s great of him to team up with us to help out the program:
  • PyOhio – Reminder that this free one day conference is in Columbus, OH on July 26, 2008.
  • – via Kevin Fricovsky using the new Twitter Search capability to track all tweets about django.
  • OSCON Python BoF – Tuesday, July 22nd 7pm – 10pm from Jax Bar and Restaurant. Via Jason Kirtland’s excellent blog discorporate.

Tip of the Week (38:32)

This tip comes to us via Ben Jao Ming in his post Django auto-translation of field values.

If you need to translate content in a field then gettext is not going to help you out. Since you can create your own custom fields it’s easy to wrap a CharField with the translation behavior:


from django.db import models
from django.utils.translation import gettext_lazy as _

class AutoTranslateField(models.CharField):
    __metaclass__ = models.SubfieldBase
    def to_python(self, value):
        return str(_(value))

Just add whatever translations you know of to the locale file and run compilemessages.

Thank You! (42:45)

GitPython 0.1.4 Released

written by Michael Trier, on Jul 16, 2008 11:24:00 PM.

I’m pleased to announce the release of GitPython 0.1.4. I appreciate all of the work from contributors on this release, especially from Florian Apolloner who has really taken the lead and managed everything.

DOWNLOAD

You can get it directly from cheeseshop at: http://pypi.python.org/pypi/GitPython/

Or checkout the tag with:


$ git fetch --tags 
$ git checkout -b 0.1.4 0.1.4 

CHANGES

  • renamed git_python to git. Be sure to delete all pyc files before testing.

Commit

  • Fixed problem with commit stats not working under all conditions.

Git

  • Renamed module to cmd.
  • Removed shell escaping completely.
  • Added support for stderr, stdin, and with_status.
  • git_dir is now optional in the constructor for git.Git. Git now falls back to os.getcwd() when git_dir is not specified.
  • add a with_exceptions keyword argument to git commands. GitCommandError is raised when the exit status is non-zero.
  • add support for a GIT_PYTHON_TRACE environment variable. GIT_PYTHON_TRACE allows us to debug GitPython’s usage of git through the use of an environment variable.

Tree

  • Fixed up problem where name doesn’t exist on root of tree.

Repo

  • Corrected problem with creating bare repo. Added Repo.create alias.

Please let us know if you find problems.

We’re at a point where we have to decide where to go with the library, so if you have ideas, we’d like to know that as well.

Two New Great Books

written by Michael Trier, on Jul 12, 2008 11:57:00 AM.

There seems to be a plethora of Python related books coming out these days. I just stumbled across two interesting ones. First up is . I desperately want this book but I’m tired of paper books. It’s available on Safari Online, but I don’t have that. I’d really like to see a Kindle version. I’ll probably end up buying the paper, because it looks to be very exciting.
Secondly is . This book is offered as a free beta book, but will also be available for purchase through Apress. I’ve skimmed the contents but plan to spend some time with it in the coming week. I’m really interested in the Deployment chapter, so I’ll probably start there first.

Hacking Pythons

written by Michael Trier, on Jun 23, 2008 8:44:00 AM.

Someone is very creative. I love it!

“What the hell is going on? This is fucking incredible.” Jacob Kaplan-Moss said. Kaplan-Moss is the chief architect of Django and said nothing like this had ever happened before. “They’re all naked, and these chicks don’t shave anything!”

GitPython

written by Michael Trier, on May 8, 2008 12:17:00 AM.

As you’re probably aware of by now, I really like Git. It took some time but things finally started clicking. One of the things I wanted to do was make it easier to interact with Git from Python / Django projects.

I searched around for a Python Git module. I really didn’t find anything that looked complete to me, although I didn’t look too hard. Not being the creative type I noticed that Ruby has the grit library created by Tom Preston-Werner and Chris Wanstrath, which is very nice. I decided to port it because I can use it for some cool stuff, and because I figured it would help me learn a lot about Python. So here it is.

About

GitPython is a python library used to interact with Git repositories.

GitPython is a port of the grit library in Ruby created by Tom Preston-Werner and Chris Wanstrath.

The method_missing stuff was taken from this blog post.

REQUIREMENTS

  • Git tested with 1.5.3.7
  • – used for running the tests
  • Mock by Michael Foord – used for tests.

INSTALL

You can download the code from CheeseShop or alternatively pull the source.


python setup.py install

SOURCE

GitPython’s git repo is available on Gitorious, which can be browsed at:

http://gitorious.org/projects/git-python/

and cloned from:

git://gitorious.org/git-python/mainline.git

USAGE

GitPython provides object model access to your git repository. Once you have created a repository object, you can traverse it to find parent commit(s), trees, blobs, etc.

Initialize a Repo object

The first step is to create a Repo object to represent your repository.


>>> from git_python import *
>>> repo = Repo("/Users/mtrier/Development/git-python")

In the above example, the directory /Users/mtrier/Development/git-python is my working repository and contains the .git directory. You can also initialize GitPython with a bare repository.


>>> repo = Repo.init_bare("/var/git/git-python.git")

Getting a list of commits

From the Repo object, you can get a list of Commit objects.


>>> repo.commits()
[, 
 , 
 , 
 ]

Called without arguments, Repo.commits returns a list of up to ten commits reachable by the master branch (starting at the latest commit). You can ask for commits beginning at a different branch, commit, tag, etc.


>>> repo.commits('mybranch')
>>> repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
>>> repo.commits('v0.1')

You can specify the maximum number of commits to return.


>>> repo.commits('master', 100)

If you need paging, you can specify a number of commits to skip.


>>> repo.commits('master', 10, 20)

The above will return commits 21-30 from the commit list.

The Commit object

Commit objects contain information about a specific commit.


>>> head = repo.commits()[0]

>>> head.id
'207c0c4418115df0d30820ab1a9acd2ea4bf4431'

>>> head.parents
[]

>>> head.tree


>>> head.author
">

>>> head.authored_date
(2008, 5, 7, 5, 0, 56, 2, 128, 0)

>>> head.committer
">

>>> head.committed_date
(2008, 5, 7, 5, 0, 56, 2, 128, 0)

>>> head.message
'cleaned up a lot of test information. Fixed escaping so it works with subprocess.'

You can traverse a commit’s ancestry by chaining calls to parents.


>>> repo.commits()[0].parents[0].parents[0].parents[0]

The above corresponds to master^^^ or master~3 in git parlance.

The Tree object

A tree records pointers to the contents of a directory. Let’s say you want the root tree of the latest commit on the master branch.


>>> tree = repo.commits()[0].tree


>>> tree.id
'a006b5b1a8115185a228b7514cdcd46fed90dc92'

Once you have a tree, you can get the contents.


>>> contents = tree.contents
[, 
 , 
 , 
 ]

This tree contains three Blob objects and one Tree object. The trees are subdirectories and the blobs are files. Trees below the root have additional attributes.


>>> contents = tree.contents[-2]


>>> contents.name
'test'

>>> contents.mode
'040000'

There is a convenience method that allows you to get a named sub-object from a tree.


>>> tree/"lib" 

You can also get a tree directly from the repository if you know its name.


>>> repo.tree()


>>> repo.tree("c1c7214dde86f76bc3e18806ac1f47c38b2b7a30")

The Blob object

A blob represents a file. Trees often contain blobs.


>>> blob = tree.contents[-1]

A blob has certain attributes.


>>> blob.name
'urls.py'

>>> blob.mode
'100644'

>>> blob.mime_type
'text/x-python'

>>> len(blob)
415

You can get the data of a blob as a string.


>>> blob.data
"from django.conf.urls.defaults import *\nfrom django.conf..." 

You can also get a blob directly from the repo if you know its name.


>>> repo.blob("b19574431a073333ea09346eafd64e7b1908ef49")

What Else?

There is more stuff in there, like the ability to tar or gzip repos, stats, blame, and probably a few other things. Additionally calls to the git instance are handled through a method_missing construct, which makes available any git commands directly, with a nice conversion of Python dicts to command line parameters.

Check the unit tests, they’re pretty exhaustive.

What is Next?

There are a couple of tests that don’t pass due to an inability to mock them properly, so I’m going to get those fixed up.

I also plan to restructure some of the object relationships. A few of them feel a little dirty to me.

LICENSE

New BSD License. See the LICENSE file.

PyCon Badges

written by Michael Trier, on Jan 29, 2008 10:13:00 PM.

PyCon 2008: Chicago

If you plan to attend PyCon 2008 in Chicago (and you should plan on it) you can now proudly display PyCon 2008 Badges on your Web site.

Help get the word out. I look forward to seeing you there.

PyCon 2008 Registration Now Open

written by Michael Trier, on Jan 20, 2008 10:09:00 PM.

Carl Karsten (CarlFK) just hoped onto IRC and announced that the PyCon 2008 Registration for Chicago on Friday, March 14, through Sunday, March 16, 2008 is now open.

I registered right away and only experienced one minor problem, which I let CarlFK know about. The site registration email does not contain the correct url. I received:

http:///2008/profile/activate/CODEHERE/??next=/2008/registration/new/

instead of:

http://us.pycon.org/2008/profile/activate/CODEHERE/??next=/2008/registration/new/.

Just fix it up and be on your way. Thanks to all the folks that worked really hard on the new site and to bring the conference together.