]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/t/tgit.py
Use Python 3 compatible "except ... as e" syntax
[bup.git] / lib / bup / t / tgit.py
index 3f0c703acd6b9f04506ec1ce273d6f6856685026..c57e8cd75e4b866bbe1c0fe5ed384f10c9f8c389 100644 (file)
@@ -1,10 +1,26 @@
 import struct, os, tempfile, time
+from subprocess import check_call
 from bup import git
 from bup.helpers import *
 from wvtest import *
 
-bup_tmp = os.path.realpath('../../../t/tmp')
-mkdirp(bup_tmp)
+
+top_dir = os.path.realpath('../../..')
+bup_exe = top_dir + '/bup'
+bup_tmp = top_dir + '/t/tmp'
+
+
+def exc(*cmd):
+    cmd_str = ' '.join(cmd)
+    print >> sys.stderr, cmd_str
+    check_call(cmd)
+
+
+def exo(*cmd):
+    cmd_str = ' '.join(cmd)
+    print >> sys.stderr, cmd_str
+    return readpipe(cmd)
+
 
 @wvtest
 def testmangle():
@@ -23,14 +39,17 @@ def testmangle():
     WVPASSEQ(git.mangle_name("f.bup", afile, adir), "f.bup.bup")
     WVPASSEQ(git.mangle_name("f", afile, adir), "f.bup")
 
-    WVPASSEQ(git.demangle_name("f.bup"), ("f", git.BUP_CHUNKED))
-    WVPASSEQ(git.demangle_name("f.bupl"), ("f", git.BUP_NORMAL))
-    WVPASSEQ(git.demangle_name("f.bup.bupl"), ("f.bup", git.BUP_NORMAL))
+    WVPASSEQ(git.demangle_name("f.bup", afile), ("f", git.BUP_CHUNKED))
+    WVPASSEQ(git.demangle_name("f.bupl", afile), ("f", git.BUP_NORMAL))
+    WVPASSEQ(git.demangle_name("f.bup.bupl", afile), ("f.bup", git.BUP_NORMAL))
+
+    WVPASSEQ(git.demangle_name(".bupm", afile), ('', git.BUP_NORMAL))
+    WVPASSEQ(git.demangle_name(".bupm", adir), ('', git.BUP_CHUNKED))
 
     # for safety, we ignore .bup? suffixes we don't recognize.  Future
     # versions might implement a .bup[a-z] extension as something other
     # than BUP_NORMAL.
-    WVPASSEQ(git.demangle_name("f.bupa"), ("f.bupa", git.BUP_NORMAL))
+    WVPASSEQ(git.demangle_name("f.bupa", afile), ("f.bupa", git.BUP_NORMAL))
 
 
 @wvtest
@@ -54,7 +73,7 @@ def testencode():
 def testpacks():
     initial_failures = wvfailure_count()
     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
-    os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
+    os.environ['BUP_MAIN_EXE'] = bup_exe
     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
     git.init_repo(bupdir)
     git.verbose = 1
@@ -100,7 +119,7 @@ def testpacks():
 def test_pack_name_lookup():
     initial_failures = wvfailure_count()
     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
-    os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
+    os.environ['BUP_MAIN_EXE'] = bup_exe
     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
     git.init_repo(bupdir)
     git.verbose = 1
@@ -129,7 +148,7 @@ def test_pack_name_lookup():
 def test_long_index():
     initial_failures = wvfailure_count()
     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
-    os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
+    os.environ['BUP_MAIN_EXE'] = bup_exe
     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
     git.init_repo(bupdir)
     w = git.PackWriter()
@@ -174,7 +193,7 @@ def test_check_repo_or_die():
         open(bupdir + '/objects/pack', 'w').close()
         try:
             git.check_repo_or_die()
-        except SystemExit, e:
+        except SystemExit as e:
             WVPASSEQ(e.code, 14)
         else:
             WVFAIL()
@@ -183,7 +202,7 @@ def test_check_repo_or_die():
 
         try:
             git.check_repo_or_die('nonexistantbup.tmp')
-        except SystemExit, e:
+        except SystemExit as e:
             WVPASSEQ(e.code, 15)
         else:
             WVFAIL()
@@ -191,3 +210,131 @@ def test_check_repo_or_die():
         os.chdir(orig_cwd)
     if wvfailure_count() == initial_failures:
         subprocess.call(['rm', '-rf', tmpdir])
+
+
+@wvtest
+def test_commit_parsing():
+    def restore_env_var(name, val):
+        if val is None:
+            del os.environ[name]
+        else:
+            os.environ[name] = val
+    def showval(commit, val):
+        return readpipe(['git', 'show', '-s',
+                         '--pretty=format:%s' % val, commit]).strip()
+    initial_failures = wvfailure_count()
+    orig_cwd = os.getcwd()
+    tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
+    workdir = tmpdir + "/work"
+    repodir = workdir + '/.git'
+    orig_author_name = os.environ.get('GIT_AUTHOR_NAME')
+    orig_author_email = os.environ.get('GIT_AUTHOR_EMAIL')
+    orig_committer_name = os.environ.get('GIT_COMMITTER_NAME')
+    orig_committer_email = os.environ.get('GIT_COMMITTER_EMAIL')
+    os.environ['GIT_AUTHOR_NAME'] = 'bup test'
+    os.environ['GIT_COMMITTER_NAME'] = os.environ['GIT_AUTHOR_NAME']
+    os.environ['GIT_AUTHOR_EMAIL'] = 'bup@a425bc70a02811e49bdf73ee56450e6f'
+    os.environ['GIT_COMMITTER_EMAIL'] = os.environ['GIT_AUTHOR_EMAIL']
+    try:
+        readpipe(['git', 'init', workdir])
+        os.environ['GIT_DIR'] = os.environ['BUP_DIR'] = repodir
+        git.check_repo_or_die(repodir)
+        os.chdir(workdir)
+        with open('foo', 'w') as f:
+            print >> f, 'bar'
+        readpipe(['git', 'add', '.'])
+        readpipe(['git', 'commit', '-am', 'Do something',
+                  '--author', 'Someone <someone@somewhere>',
+                  '--date', 'Sat Oct 3 19:48:49 2009 -0400'])
+        commit = readpipe(['git', 'show-ref', '-s', 'master']).strip()
+        parents = showval(commit, '%P')
+        tree = showval(commit, '%T')
+        cname = showval(commit, '%cn')
+        cmail = showval(commit, '%ce')
+        cdate = showval(commit, '%ct')
+        coffs = showval(commit, '%ci')
+        coffs = coffs[-5:]
+        coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
+        if coffs[-5] == '-':
+            coff = - coff
+        commit_items = git.get_commit_items(commit, git.cp())
+        WVPASSEQ(commit_items.parents, [])
+        WVPASSEQ(commit_items.tree, tree)
+        WVPASSEQ(commit_items.author_name, 'Someone')
+        WVPASSEQ(commit_items.author_mail, 'someone@somewhere')
+        WVPASSEQ(commit_items.author_sec, 1254613729)
+        WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
+        WVPASSEQ(commit_items.committer_name, cname)
+        WVPASSEQ(commit_items.committer_mail, cmail)
+        WVPASSEQ(commit_items.committer_sec, int(cdate))
+        WVPASSEQ(commit_items.committer_offset, coff)
+        WVPASSEQ(commit_items.message, 'Do something\n')
+        with open('bar', 'w') as f:
+            print >> f, 'baz'
+        readpipe(['git', 'add', '.'])
+        readpipe(['git', 'commit', '-am', 'Do something else'])
+        child = readpipe(['git', 'show-ref', '-s', 'master']).strip()
+        parents = showval(child, '%P')
+        commit_items = git.get_commit_items(child, git.cp())
+        WVPASSEQ(commit_items.parents, [commit])
+    finally:
+        os.chdir(orig_cwd)
+        restore_env_var('GIT_AUTHOR_NAME', orig_author_name)
+        restore_env_var('GIT_AUTHOR_EMAIL', orig_author_email)
+        restore_env_var('GIT_COMMITTER_NAME', orig_committer_name)
+        restore_env_var('GIT_COMMITTER_EMAIL', orig_committer_email)
+    if wvfailure_count() == initial_failures:
+        subprocess.call(['rm', '-rf', tmpdir])
+
+
+@wvtest
+def test_list_refs():
+    initial_failures = wvfailure_count()
+    tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
+    os.environ['BUP_MAIN_EXE'] = bup_exe
+    os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
+    src = tmpdir + '/src'
+    mkdirp(src)
+    with open(src + '/1', 'w+') as f:
+        print f, 'something'
+    with open(src + '/2', 'w+') as f:
+        print f, 'something else'
+    git.init_repo(bupdir)
+    emptyset = frozenset()
+    WVPASSEQ(frozenset(git.list_refs()), emptyset)
+    WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+    WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), emptyset)
+    exc(bup_exe, 'index', src)
+    exc(bup_exe, 'save', '-n', 'src', '--strip', src)
+    src_hash = exo('git', '--git-dir', bupdir,
+                   'rev-parse', 'src').strip().split('\n')
+    assert(len(src_hash) == 1)
+    src_hash = src_hash[0].decode('hex')
+    tree_hash = exo('git', '--git-dir', bupdir,
+                   'rev-parse', 'src:').strip().split('\n')[0].decode('hex')
+    blob_hash = exo('git', '--git-dir', bupdir,
+                   'rev-parse', 'src:1').strip().split('\n')[0].decode('hex')
+    WVPASSEQ(frozenset(git.list_refs()),
+             frozenset([('refs/heads/src', src_hash)]))
+    WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+    WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+             frozenset([('refs/heads/src', src_hash)]))
+    exc('git', '--git-dir', bupdir, 'tag', 'commit-tag', 'src')
+    WVPASSEQ(frozenset(git.list_refs()),
+             frozenset([('refs/heads/src', src_hash),
+                        ('refs/tags/commit-tag', src_hash)]))
+    WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)),
+             frozenset([('refs/tags/commit-tag', src_hash)]))
+    WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+             frozenset([('refs/heads/src', src_hash)]))
+    exc('git', '--git-dir', bupdir, 'tag', 'tree-tag', 'src:')
+    exc('git', '--git-dir', bupdir, 'tag', 'blob-tag', 'src:1')
+    os.unlink(bupdir + '/refs/heads/src')
+    expected_tags = frozenset([('refs/tags/commit-tag', src_hash),
+                               ('refs/tags/tree-tag', tree_hash),
+                               ('refs/tags/blob-tag', blob_hash)])
+    WVPASSEQ(frozenset(git.list_refs()), expected_tags)
+    WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), frozenset([]))
+    WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), expected_tags)
+    if wvfailure_count() == initial_failures:
+        subprocess.call(['rm', '-rf', tmpdir])