Module test_GitRepository
[hide private]
[frames] | no frames]

Module test_GitRepository

Test gbp.git.GitRepository

This testcase creates several repositores:

Functions [hide private]
 
test_create()
Create a repository
 
test_empty()
Empty repos have no branch
 
test_add_files()
Add some dummy data
 
test_branch_master()
First branch is called master
 
test_create_branch()
Create a branch name foo
 
test_delete_branch()
Create a branch named foo2 and delete it
 
test_set_branch()
Switch to branch named foo
 
test_rename_branch()
Create branch named baz, rename it to bax and finally delete it
 
test_tag()
Create a tag named tag and check it's existance
 
test_find_tag()
Find tags
 
test_move_tag()
Move a tag
 
test_delete_tag()
Delete tags
 
test_get_obj_type()
Find commit SHA1 related to tags
 
test_list_files()
List files in the index
 
test_get_commits()
Test listing commits
 
test_get_commit_info()
Test inspecting commits
 
test_mirror_clone()
Mirror a repository
 
test_clone()
Clone a repository
 
test_merge()
Merge a branch
 
test_pull()
Pull from a remote repository
 
test_fetch()
Fetch from a remote repository
 
test_create_bare()
Create a bare repository
 
test_nonexistant()
Check that accessing a non existant repository fails.
 
test_create_noperm()
Check that creating a repository at a path that isn't writeable fails
 
test_checkout()
Checkout treeishs
 
test_gc()
Test garbace collection
 
test_grep()
Test grepping through commit messages
 
test_is_ff()
Test if branch is fast forwardable
 
test_update_ref()
Test updating a reference
 
test_make_tree()
Test git-mk-tree
 
test_update_submodules()
Updating submodules if we don't have any is a noop
 
test_get_merge_base()
Find the common ancestor of two objects
 
test_teardown()
Perform the teardown
Variables [hide private]
  repo_dir = '/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp...
  bare_dir = '/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp...
  clone_dir = '/tmp/buildd/git-buildpackage-0.6.0~git20120803/gb...
  mirror_clone_dir = '/tmp/buildd/git-buildpackage-0.6.0~git2012...
  __package__ = None
hash(x)
Function Details [hide private]

test_create()

 

Create a repository

Methods tested:

Properties tested:

>>> import os, gbp.git
>>> repo = gbp.git.GitRepository.create(repo_dir)
>>> repo.path == repo_dir
True
>>> repo.git_dir == os.path.join(repo_dir, '.git')
True
>>> type(repo) == gbp.git.GitRepository
True

test_empty()

 

Empty repos have no branch

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.get_branch()
>>> repo.branch
>>> repo.is_empty()
True

test_add_files()

 

Add some dummy data

Methods tested:

Properties tested:

>>> import gbp.git, shutil
>>> repo = gbp.git.GitRepository(repo_dir)
>>> shutil.copy(os.path.join(repo.path, ".git/HEAD"),                                  os.path.join(repo.path, "testfile"))
>>> repo.is_clean()[0]
False
>>> repo.is_clean(ignore_untracked=True)[0]
True
>>> repo.add_files(repo.path, force=True)
>>> repo.commit_all(msg="foo")
>>> repo.is_clean()[0]
True
>>> h = repo.head
>>> len(h)
40

test_branch_master()

 

First branch is called master

Methods tested:

>>> import gbp.git, shutil
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.get_branch()
'master'
>>> repo.branch
'master'

test_create_branch()

 

Create a branch name foo

Methods tested:

>>> import gbp.git, shutil
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.create_branch("foo")
>>> repo.branch_contains("foo", 'HEAD')
True
>>> repo.branch_contains("doesnotexist", 'HEAD', remote=True)
False

test_delete_branch()

 

Create a branch named foo2 and delete it

Methods tested:

>>> import gbp.git, shutil
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.create_branch("bar")
>>> repo.delete_branch("bar")
>>> repo.delete_branch("master")
Traceback (most recent call last):
...
GitRepositoryError: Can't delete the branch you're on

test_set_branch()

 

Switch to branch named foo

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.set_branch("foo")
>>> repo.get_branch() == "foo"
True
>>> repo.branch == "foo"
True

test_rename_branch()

 

Create branch named baz, rename it to bax and finally delete it

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.create_branch("baz")
>>> repo.rename_branch("baz", "bax")
>>> repo.delete_branch("bax")

test_tag()

 

Create a tag named tag and check it's existance

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.create_tag("tag")
>>> repo.has_tag("tag")
True
>>> repo.has_tag("unknown")
False
>>> repo.create_tag("tag2", msg="foo")
>>> repo.has_tag("tag2")
True
>>> repo.verify_tag("tag2")
False
>>> repo.get_tags()
['tag', 'tag2']
>>> repo.tags
['tag', 'tag2']

test_find_tag()

 

Find tags

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.find_tag('HEAD')
'tag2'
>>> repo.find_tag('HEAD', pattern='foo*')
Traceback (most recent call last):
...
GitRepositoryError: Can't find tag for HEAD

test_move_tag()

 

Move a tag

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.move_tag("tag", "moved")
>>> repo.has_tag("tag")
False
>>> repo.has_tag("moved")
True

test_delete_tag()

 

Delete tags

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.has_tag("moved")
True
>>> repo.delete_tag("moved")
>>> repo.has_tag("moved")
False

test_get_obj_type()

 

Find commit SHA1 related to tags

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.create_tag("tag3", "tag msg")
>>> repo.get_obj_type("tag3")
'tag'
>>> repo.get_obj_type("HEAD")
'commit'
>>> repo.get_obj_type("HEAD:testfile")
'blob'
>>> repo.delete_tag("tag3")

test_list_files()

 

List files in the index

Methods tested:

>>> import gbp.git, os, shutil
>>> repo = gbp.git.GitRepository(repo_dir)
>>> src = os.path.join(repo.path, ".git/HEAD")
>>> dst = os.path.join(repo.path, "testfile")
>>> repo.list_files()
['testfile']
>>> repo.list_files(['modified'])
[]
>>> repo.list_files(['modified', 'deleted'])
[]
>>> repo.list_files(['modified', 'deleted', 'cached'])
['testfile']
>>> shutil.copy(src, dst)
>>> repo.list_files(['modified'])
['testfile']
>>> repo.add_files(dst)
>>> repo.commit_staged(msg="foo")
>>> repo.list_files(['modified'])
[]
>>> repo.list_files(['foo'])
Traceback (most recent call last):
...
GitRepositoryError: Unknown type 'foo'
>>> repo.force_head('HEAD^', hard=True)
>>> repo.list_files(['modified'])
[]
>>> shutil.copy(src, dst)
>>> repo.list_files(['modified'])
['testfile']
>>> repo.commit_files(dst, msg="foo")
>>> repo.list_files(['modified'])
[]

test_get_commits()

 

Test listing commits

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> commits = repo.get_commits()
>>> type(commits) == list and len(commits) == 2
True
>>> len(repo.get_commits(num=1)) == 1
True
>>> repo.get_commits(paths=['foo', 'bar'])
[]
>>> repo.get_commits(paths=['testfile']) == commits
True

test_get_commit_info()

 

Test inspecting commits

Methods tested:

>>> import gbp.git
>>> from datetime import datetime
>>> repo = gbp.git.GitRepository(repo_dir)
>>> info = repo.get_commit_info('HEAD')
>>> info['id']
'HEAD'
>>> info['body']
''
>>> info['subject']
'foo'
>>> '@' in info['author'].email
True
>>> '@' in info['committer'].email
True
>>> now = datetime.now()
>>> (now - datetime.fromtimestamp(int(info['author'].date.split()[0]))).seconds < 10
True
>>> (now - datetime.fromtimestamp(int(info['committer'].date.split()[0]))).seconds < 10
True
>>> info['files']
defaultdict(<type 'list'>, {'M': ['testfile']})

test_mirror_clone()

 

Mirror a repository

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.set_branch('master')
>>> mirror = gbp.git.GitRepository.clone(mirror_clone_dir, repo.path, mirror=True)
>>> mirror.is_empty()
False
>>> mirror.branch
'master'
>>> mirror.has_branch('foo')
True
>>> mirror.has_branch('bar')
False
>>> mirror.set_branch('foo')
>>> mirror.branch
'foo'
>>> mirror.force_head('foo^')

test_clone()

 

Clone a repository

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.set_branch('master')
>>> clone = gbp.git.GitRepository.clone(clone_dir, repo.path)
>>> clone.is_empty()
False
>>> clone.branch
'master'
>>> clone.get_remote_branches()
['origin/HEAD', 'origin/foo', 'origin/master']
>>> clone.get_local_branches()
['master']
>>> clone.get_merge_branch('master')
'origin/master'
>>> clone.create_branch('foo', 'origin/foo')
>>> clone.get_merge_branch('foo')
'origin/foo'
>>> clone.create_branch('bar')
>>> clone.get_merge_branch('bar') # None if no merge branch exists
>>> clone.get_local_branches()
['bar', 'foo', 'master']
>>> clone.get_remote_repos()
['origin']
>>> clone.has_remote_repo('origin')
True
>>> clone.has_branch('origin/master', remote=True)
True
>>> clone.has_remote_repo('godiug')
False

test_merge()

 

Merge a branch

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.set_branch('master')
>>> repo.merge('foo')

test_pull()

 

Pull from a remote repository

Methods tested:

>>> import gbp.git, os
>>> d = os.path.join(clone_dir, 'gbp_%s_test_repo' % __name__)
>>> clone = gbp.git.GitRepository(d)
>>> clone.set_branch('master')
>>> clone.pull()

test_fetch()

 

Fetch from a remote repository

Methods tested:

>>> import gbp.git, os
>>> d = os.path.join(clone_dir, 'gbp_%s_test_repo' % __name__)
>>> clone = gbp.git.GitRepository(d)
>>> clone.fetch()
>>> clone.push()
>>> clone.push('origin')
>>> clone.push('origin', 'master')
>>> clone.create_tag('tag3')
>>> clone.push_tag('origin', 'tag3')
>>> clone.add_remote_repo('foo', repo_dir)
>>> clone.fetch('foo')
>>> clone.fetch('foo', tags=True)
>>> clone.remove_remote_repo('foo')

test_create_bare()

 

Create a bare repository

Methods tested:

>>> import gbp.git
>>> bare = gbp.git.GitRepository.create(bare_dir, bare=True, description="msg")
>>> bare.path == bare_dir
True
>>> bare.git_dir[:-1] == bare_dir
True
>>> type(bare) == gbp.git.GitRepository
True
>>> bare.is_empty()
True
>>> bare.is_clean()
(True, '')

test_nonexistant()

 

Check that accessing a non existant repository fails.

Methods tested:

>>> import gbp.git
>>> bare = gbp.git.GitRepository("/does/not/exist")
Traceback (most recent call last):
...
GitRepositoryError: No Git repository at '/does/not/exist'

test_create_noperm()

 

Check that creating a repository at a path that isn't writeable fails

Methods tested:

>>> import gbp.git
>>> gbp.git.GitRepository.create("/does/not/exist")
Traceback (most recent call last):
...
GitRepositoryError: Cannot create Git repository at '/does/not/exist': Permission denied

test_checkout()

 

Checkout treeishs

Methods tested:

Properties tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.checkout('master')
>>> repo.branch
'master'
>>> repo.rev_parse('doesnotexist')
Traceback (most recent call last):
...
GitRepositoryError: revision 'doesnotexist' not found
>>> sha1 = repo.rev_parse('master', short=10)
>>> len(sha1)
10
>>> sha1 = repo.rev_parse('master')
>>> len(sha1)
40
>>> repo.checkout(sha1)
>>> repo.branch
>>> repo.get_branch()
Traceback (most recent call last):
...
GitRepositoryError: Currently not on a branch
>>> tag = repo.tags[0]
>>> repo.checkout(tag)
>>> repo.branch

test_gc()

 

Test garbace collection

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.collect_garbage()

test_grep()

 

Test grepping through commit messages

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.set_branch('master')
>>> len(repo.grep_log('foo')) == 2
True
>>> len(repo.grep_log('foo', 'master')) == 2
True
>>> repo.grep_log('blafasel')
[]
>>> repo.grep_log('foo', 'doesnotexist')
Traceback (most recent call last):
...
GitRepositoryError: Error grepping log for foo

test_is_ff()

 

Test if branch is fast forwardable

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.is_fast_forward('master', 'foo')
(True, True)
>>> repo.create_branch('ff', 'HEAD^')
>>> repo.is_fast_forward('ff', 'master')
(True, False)
>>> repo.is_fast_forward('master', 'ff')
(False, True)

test_update_ref()

 

Test updating a reference

Methods tested:

>>> import gbp.git, os
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.update_ref('new_ref', 'master', msg='update')
>>> os.path.exists(os.path.join(repo.git_dir, 'new_ref'))
True

test_make_tree()

 

Test git-mk-tree

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> sha1 = repo.write_file('testfile')
>>> sha1
'19af7398c894bc5e86e17259317e4db519e9241f'
>>> head = repo.list_tree('HEAD')
>>> head
[['100644', 'blob', '19af7398c894bc5e86e17259317e4db519e9241f', 'testfile']]
>>> head.append(['100644', 'blob', '19af7398c894bc5e86e17259317e4db519e9241f', 'testfile2'])
>>> repo.make_tree(head)
'745951810c9e22fcc6de9b23f05efd6ab5512123'

test_update_submodules()

 

Updating submodules if we don't have any is a noop

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> repo.has_submodules()
False
>>> repo.update_submodules()

test_get_merge_base()

 

Find the common ancestor of two objects

Methods tested:

>>> import gbp.git
>>> repo = gbp.git.GitRepository(repo_dir)
>>> sha1 = repo.get_merge_base('master', 'foo')
>>> len(sha1)
40
>>> repo.get_merge_base('master', 'doesnotexist')
Traceback (most recent call last):
...
GitRepositoryError: Failed to get common ancestor: fatal: Not a valid object name doesnotexist

test_teardown()

 

Perform the teardown

>>> import shutil, os
>>> os.getenv("GBP_TESTS_NOCLEAN") or shutil.rmtree(repo_dir)
>>> os.getenv("GBP_TESTS_NOCLEAN") or shutil.rmtree(bare_dir)
>>> os.getenv("GBP_TESTS_NOCLEAN") or shutil.rmtree(mirror_clone_dir)
>>> os.getenv("GBP_TESTS_NOCLEAN") or shutil.rmtree(clone_dir)

Variables Details [hide private]

repo_dir

Value:
'/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp_test_GitRepository\
_test_repo'

bare_dir

Value:
'/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp_test_GitRepository\
_test_bare'

clone_dir

Value:
'/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp_test_GitRepository\
_test_clone'

mirror_clone_dir

Value:
'/tmp/buildd/git-buildpackage-0.6.0~git20120803/gbp_test_GitRepository\
_test_mirror_clone'