Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9312071
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
31 KB
Subscribers
None
View Options
diff --git a/bin/swh-backend b/bin/swh-backend
index 0124211..4bee07c 100755
--- a/bin/swh-backend
+++ b/bin/swh-backend
@@ -1,58 +1,58 @@
#!/usr/bin/env python3
# Copyright (C) 2015 Stefano Zacchiroli <zack@upsilon.cc>,
# Antoine R. Dumont <antoine.romain.dumont@gmail.com>
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import argparse
import logging
import os
+from swh.core.conf import reader
from swh.loader.git.backend import api
-from swh.loader.git.conf import reader
from swh.storage.objstorage import ObjStorage
# Default configuration file
DEFAULT_CONF_FILE = '~/.config/swh/back.ini'
# default configuration
DEFAULT_CONF = {
'content_storage_dir' : ('string', '/tmp/swh-loader-git/content-storage'),
'log_dir' : ('string', '/tmp/swh-loader-git/log'),
'db_url' : ('string', 'dbname=softwareheritage-dev'),
'folder_depth' : ('int' , 4),
'debug' : ('bool' , None),
'host' : ('string', '127.0.0.1'),
'port' : ('int' , 5000)
}
def parse_args():
"""Parse the configuration for the cli.
"""
cli = argparse.ArgumentParser(
description='Parse git repository objects to load them into DB.')
cli.add_argument('--verbose', '-v', action='store_true',
help='Verbosity level in log file.')
cli.add_argument('--config', '-c', help='configuration file path')
args = cli.parse_args()
return args
if __name__ == '__main__':
args = parse_args()
conf = reader.read(args.config or DEFAULT_CONF_FILE, DEFAULT_CONF)
reader.prepare_folders(conf, 'log_dir', 'content_storage_dir')
conf.update({
'objstorage': ObjStorage(conf['content_storage_dir'],
conf['folder_depth'])
})
logging.basicConfig(filename=os.path.join(conf['log_dir'], 'back.log'),
level=logging.DEBUG if args.verbose else logging.INFO)
api.run(conf)
diff --git a/bin/swh-db-manager b/bin/swh-db-manager
index a690114..079b3c7 100755
--- a/bin/swh-db-manager
+++ b/bin/swh-db-manager
@@ -1,56 +1,57 @@
#!/usr/bin/env python3
# Copyright (C) 2015 Stefano Zacchiroli <zack@upsilon.cc>,
# Antoine R. Dumont <antoine.romain.dumont@gmail.com>
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
+
import argparse
import logging
import os
-
+from swh.core.conf import reader
from swh.loader.git import manager
-from swh.loader.git.conf import reader
+
# Default configuration file
DEFAULT_CONF_FILE = '~/.config/swh/db-manager.ini'
# default configuration (can be overriden by the DEFAULT_CONF_FILE)
DEFAULT_CONF = {
'log_dir': ('string', '/tmp/swh-loader-git/log'),
'db_url' : ('string', 'dbname=softwareheritage-dev')
}
def parse_args():
"""Parse the configuration for the cli.
"""
cli = argparse.ArgumentParser(
description='Parse git repository objects to load them into DB.')
cli.add_argument('--verbose', '-v', action='store_true',
help='Verbosity level in log file.')
cli.add_argument('--config', '-c', help='configuration file path')
subcli = cli.add_subparsers(dest='action')
subcli.add_parser('initdb', help='initialize DB')
subcli.add_parser('cleandb', help='clean DB')
args = cli.parse_args()
if not args.action:
cli.error('no action given')
return args
if __name__ == '__main__':
args = parse_args()
conf = reader.read(args.config or DEFAULT_CONF_FILE, DEFAULT_CONF)
reader.prepare_folders(conf, 'log_dir')
logging.basicConfig(filename=os.path.join(conf['log_dir'], 'db-manager.log'),
level=logging.DEBUG if args.verbose else logging.INFO)
manager.manage(args.action, conf['db_url'])
diff --git a/bin/swh-loader-git b/bin/swh-loader-git
index 3d6ae75..9913310 100755
--- a/bin/swh-loader-git
+++ b/bin/swh-loader-git
@@ -1,67 +1,69 @@
#!/usr/bin/env python3
# Copyright (C) 2015 Stefano Zacchiroli <zack@upsilon.cc>,
# Antoine R. Dumont <antoine.romain.dumont@gmail.com>
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
+
import argparse
import logging
import os
+from swh.core.conf import reader
from swh.loader.git import loader
-from swh.loader.git.conf import reader
+
# Default configuration file
DEFAULT_CONF_FILE = '~/.config/swh/loader-git.ini'
# default configuration (can be overriden by the DEFAULT_CONF_FILE)
DEFAULT_CONF = {
'log_dir': ('string', '/tmp/swh-loader-git/log'),
'backend-type': ('string', 'remote'),
'backend': ('string', 'http://localhost:5000'),
}
# Another example of configuration:
# DEFAULT_CONF = {
# 'log_dir': ('string', '/tmp/swh-loader-git/log'),
# 'backend-type': ('string', 'local'),
# 'backend': ('string', '~/.config/swh/back.ini'),
# }
def parse_args():
"""Parse the CLI arguments.
"""
cli = argparse.ArgumentParser(
description='Parse git repository objects to load them into DB.')
cli.add_argument('--verbose', '-v', action='store_true',
help='Verbosity level in log file.')
cli.add_argument('--config', '-c', help='configuration file path')
subcli = cli.add_subparsers(dest='action')
load_cli = subcli.add_parser('load', help='load Git repo into DB')
load_cli.add_argument('repository', help='Git repository path')
args = cli.parse_args()
if not args.action:
cli.error('no action given')
return args
if __name__ == '__main__':
args = parse_args()
conf = reader.read(args.config or DEFAULT_CONF_FILE, DEFAULT_CONF)
reader.prepare_folders(conf, 'log_dir')
conf['action'] = args.action
conf['repo_path'] = args.repository
logging.basicConfig(filename=os.path.join(conf['log_dir'], 'sgloader.log'),
level=logging.DEBUG if args.verbose else logging.INFO)
loader.load(conf)
diff --git a/swh/loader/git/conf/reader.py b/swh/loader/git/conf/reader.py
deleted file mode 100755
index f332883..0000000
--- a/swh/loader/git/conf/reader.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright (C) 2015 The Software Heritage developers
-# See the AUTHORS file at the top-level directory of this distribution
-# License: GNU General Public License version 3, or any later version
-# See top-level LICENSE file for more information
-
-import configparser
-import os
-
-
-_map_convert_fn = {'int': int,
- 'bool': lambda x: x == 'true'} # conversion per type
-
-
-def read(conf_file, default_conf=None):
- """Read the user's configuration file.
- Fill in the gap using `default_conf`.
-`default_conf` is similar to this:
-DEFAULT_CONF = {
- 'a': ('string', '/tmp/swh-loader-git/log'),
- 'b': ('string', 'dbname=swhloadergit')
- 'c': ('bool', true)
- 'e': ('bool', None)
- 'd': ('int', 10)
-}
-
- """
- config = configparser.ConfigParser(defaults=default_conf)
- config.read(os.path.expanduser(conf_file))
- conf = config._sections['main']
-
- # remaining missing default configuration key are set
- # also type conversion is enforced for underneath layer
- for key in default_conf:
- nature_type, default_value = default_conf[key]
- val = conf.get(key, None)
- if not val: # fallback to default value
- conf[key] = default_value
- else: # value present but in string format, force type conversion
- conf[key] = _map_convert_fn.get(nature_type, lambda x: x)(val)
-
- return conf
-
-
-def prepare_folders(conf, *keys):
- """Prepare the folder mentioned in config under keys.
- """
- def makedir(folder):
- if not os.path.exists(folder):
- os.makedirs(folder)
-
- for key in keys:
- makedir(conf[key])
diff --git a/swh/loader/git/local_store.py b/swh/loader/git/local_store.py
index d5ecfd7..2e0446c 100644
--- a/swh/loader/git/local_store.py
+++ b/swh/loader/git/local_store.py
@@ -1,108 +1,109 @@
# Copyright (C) 2015 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
+
+from swh.core.conf import reader
from swh.loader.git.storage import storage, db, service
-from swh.loader.git.conf import reader
from swh.storage.objstorage import ObjStorage
# FIXME: duplicated from bin/swh-backend...
# Default configuration file
DEFAULT_CONF_FILE = '~/.config/swh/back.ini'
# default configuration
DEFAULT_CONF = {
'content_storage_dir': ('string', '/tmp/swh-loader-git/content-storage'),
'log_dir': ('string', '/tmp/swh-loader-git/log'),
'db_url': ('string', 'dbname=softwareheritage-dev'),
'folder_depth': ('int', 4),
'debug': ('bool', None),
'host': ('string', '127.0.0.1'),
'port': ('int', 5000)
}
def store_only_new(db_conn, conf, obj_type, obj):
"""Store object if not already present.
"""
if not storage.find(db_conn, obj['id'], obj_type):
storage.add(db_conn, conf, obj)
_obj_to_persist_fn = {storage.Type.revision: service.add_revisions}
def store_unknown_objects(db_conn, conf, obj_type, swhmap):
"""Load objects to the backend.
"""
sha1s = swhmap.keys()
# have: filter unknown obj
unknown_obj_sha1s = service.filter_unknowns_type(db_conn, obj_type, sha1s)
if not unknown_obj_sha1s:
return True
# seen: now store in backend
persist_fn = _obj_to_persist_fn.get(obj_type, service.add_objects)
obj_fulls = map(swhmap.get, unknown_obj_sha1s)
return persist_fn(db_conn, conf, obj_type, obj_fulls)
def load_to_back(conf, swh_repo):
"""Load to the backend the repository swh_repo.
"""
with db.connect(conf['db_url']) as db_conn:
# First, store/retrieve the origin identifier
# FIXME: should be done by the cloner worker (which is not yet plugged
# on the right swh db ftm)
service.add_origin(db_conn, swh_repo.get_origin())
# First reference all unknown persons
service.add_persons(db_conn, conf, storage.Type.person,
swh_repo.get_persons())
res = store_unknown_objects(db_conn, conf,
storage.Type.content,
swh_repo.get_contents())
if res:
res = store_unknown_objects(db_conn, conf,
storage.Type.directory,
swh_repo.get_directories())
if res:
res = store_unknown_objects(db_conn, conf,
storage.Type.revision,
swh_repo.get_revisions())
if res:
# brutally send all remaining occurrences
service.add_objects(db_conn, conf,
storage.Type.occurrence,
swh_repo.get_occurrences())
# and releases (the idea here is that compared to existing
# objects, the quantity is less)
service.add_objects(db_conn, conf,
storage.Type.release,
swh_repo.get_releases())
def prepare_and_load_to_back(backend_setup_file, swh_repo):
"""Prepare and load to back the swh_repo.
backend-setup-file is the backend's setup to load to access the db and file
storage.
"""
# Read the configuration file (no check yet)
conf = reader.read(backend_setup_file or DEFAULT_CONF_FILE, DEFAULT_CONF)
reader.prepare_folders(conf, 'content_storage_dir')
conf.update({
'objstorage': ObjStorage(conf['content_storage_dir'],
conf['folder_depth'])
})
load_to_back(conf, swh_repo)
diff --git a/swh/loader/git/tests/test_local_loader.py b/swh/loader/git/tests/test_local_loader.py
index c6f92dc..04daa46 100644
--- a/swh/loader/git/tests/test_local_loader.py
+++ b/swh/loader/git/tests/test_local_loader.py
@@ -1,249 +1,249 @@
# coding: utf-8
# Copyright (C) 2015 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import unittest
import pygit2
import tempfile
import shutil
from nose.plugins.attrib import attr
from nose.tools import istest
+from swh.core.conf import reader
from swh.loader.git.storage import db, models
from swh.loader.git import loader
-from swh.loader.git.conf import reader
import test_initdb
from test_utils import list_files_from
from test_git_utils import create_commit_with_content, create_tag
@attr('slow')
class TestLocalLoader(unittest.TestCase):
def setUp(self):
"""Initialize a git repository for the remaining test to manipulate.
"""
tmp_git_folder_path = tempfile.mkdtemp(prefix='test-sgloader.',
dir='/tmp')
self.tmp_git_repo = pygit2.init_repository(tmp_git_folder_path)
self.conf_back = reader.read('./resources/test/back.ini',
{'port': ('int', 9999)})
self.db_url = self.conf_back['db_url']
self.conf = {
'action': 'load',
'repo_path': self.tmp_git_repo.workdir,
'backend-type': 'local',
'backend': './resources/test/back.ini'
}
def init_db_setup(self):
"""Initialize a git repository for the remaining test to manipulate.
"""
test_initdb.prepare_db(self.db_url)
def tearDown(self):
"""Destroy the test git repository.
"""
shutil.rmtree(self.tmp_git_repo.workdir)
shutil.rmtree(self.conf_back['content_storage_dir'], ignore_errors=True)
@istest
def should_fail_on_bad_action(self):
# when
try:
loader.load({'action': 'unknown'})
except:
pass
@istest
def should_fail_on_inexistant_folder(self):
# when
try:
loader.load({'action': 'load',
'repo_path': 'something-that-definitely-does-not-exist'})
except:
pass
@istest
def should_fail_on_inexistant_backend_type(self):
# when
try:
loader.load({'action': 'load',
'repo_path': '.',
'backend-type': 'unknown'}) # only local or remote supported
except:
pass
@istest
def local_loader(self):
"""Trigger loader and make sure everything is ok.
"""
self.init_db_setup()
# given
commit0 = create_commit_with_content(self.tmp_git_repo, 'blob 0',
'commit msg 0')
commit1 = create_commit_with_content(self.tmp_git_repo, 'blob 1',
'commit msg 1',
[commit0.hex])
commit2 = create_commit_with_content(self.tmp_git_repo, 'blob 2',
'commit msg 2',
[commit1.hex])
commit3 = create_commit_with_content(self.tmp_git_repo, None,
'commit msg 3',
[commit2.hex])
commit4 = create_commit_with_content(self.tmp_git_repo, 'blob 4',
'commit msg 4',
[commit3.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf_back['content_storage_dir']))
self.assertEquals(nb_files, 4, "4 blobs.")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
5,
"Should be 5 commits")
self.assertEquals(
models.count_directories(db_conn),
5,
"Should be 5 trees")
self.assertEquals(
models.count_contents(db_conn),
4,
"Should be 4 blobs as we created one commit without data!")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
1,
"Should be 1 reference (master) so 1 occurrence.")
# given
commit5 = create_commit_with_content(self.tmp_git_repo, 'new blob 5',
'commit msg 5',
[commit4.hex])
commit6 = create_commit_with_content(self.tmp_git_repo,
'new blob and last 6',
'commit msg 6',
[commit5.hex])
commit7 = create_commit_with_content(self.tmp_git_repo, 'new blob 7',
'commit msg 7',
[commit6.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf_back['content_storage_dir']))
self.assertEquals(nb_files, 4+3, "3 new blobs.")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
8,
"Should be 5+3 == 8 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 5+3 == 8 trees")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 4+3 == 7 blobs")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
2,
"Should be 1 reference which changed twice so 2 occurrences (master changed).")
# given
create_commit_with_content(self.tmp_git_repo, None,
'commit 8 with parent 2',
[commit7.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf_back['content_storage_dir']))
self.assertEquals(nb_files, 7, "no new blob.")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
9,
"Should be 8+1 == 9 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 8 trees (new commit without blob so no new tree)")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 7 blobs (new commit without new blob)")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
3,
"Should be 1 reference which changed thrice so 3 occurrences (master changed again).")
self.assertEquals(
models.count_person(db_conn),
2,
"1 author + 1 committer")
# add tag
create_tag(self.tmp_git_repo, '0.0.1', commit5, 'bad ass release 0.0.1, towards infinity...')
create_tag(self.tmp_git_repo, '0.0.2', commit7, 'release 0.0.2... and beyond')
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf_back['content_storage_dir']))
self.assertEquals(nb_files, 7, "no new blob.")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
9,
"Should be 8+1 == 9 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 8 trees (new commit without blob so no new tree)")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 7 blobs (new commit without new blob)")
self.assertEquals(
models.count_release(db_conn),
2,
"Should be 2 annotated tags so 2 releases")
self.assertEquals(
models.count_occurrence(db_conn),
3,
"master did not change this time so still 3 occurrences")
self.assertEquals(
models.count_person(db_conn),
3,
"1 author + 1 committer + 1 tagger")
diff --git a/swh/loader/git/tests/test_remote_loader.py b/swh/loader/git/tests/test_remote_loader.py
index 971f83e..dcaf401 100644
--- a/swh/loader/git/tests/test_remote_loader.py
+++ b/swh/loader/git/tests/test_remote_loader.py
@@ -1,252 +1,252 @@
# coding: utf-8
# Copyright (C) 2015 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import unittest
import pygit2
import tempfile
import shutil
import os
from nose.plugins.attrib import attr
from nose.tools import istest
+from swh.core.conf import reader
from swh.loader.git.storage import db, models
from swh.loader.git import loader
-from swh.loader.git.conf import reader
import test_initdb
from test_git_utils import create_commit_with_content, create_tag
from test_utils import list_files_from
@attr('slow')
class TestRemoteLoader(unittest.TestCase):
def setUp(self):
tmp_git_folder_path = tempfile.mkdtemp(prefix='test-sgloader.',
dir='/tmp')
self.tmp_git_repo = pygit2.init_repository(tmp_git_folder_path)
self.conf = reader.read('./resources/test/back.ini',
{'port': ('int', 9999)})
self.db_url = self.conf['db_url']
self.conf.update({
'action': 'load',
'repo_path': self.tmp_git_repo.workdir,
'backend-type': 'remote',
'backend': 'http://localhost:%s' % self.conf['port']
})
# Not the remote loader in charge of creating the folder, so we do it
if not os.path.exists(self.conf['content_storage_dir']):
os.mkdir(self.conf['content_storage_dir'])
def init_db_setup(self):
"""Initialize a git repository for the remaining test to manipulate.
"""
test_initdb.prepare_db(self.db_url)
def tearDown(self):
"""Destroy the test git repository.
"""
shutil.rmtree(self.tmp_git_repo.workdir)
shutil.rmtree(self.conf['content_storage_dir'])
@istest
def should_fail_on_bad_action(self):
# when
try:
loader.load({'action': 'unknown'})
except:
# FIXME assert raises
pass
@istest
def should_fail_on_inexistant_folder(self):
# when
try:
loader.load({'action': 'load',
'repo_path': 'something-that-definitely-does-not-exist'})
except:
pass
@istest
def should_fail_on_inexistant_backend_type(self):
# when
try:
loader.load({'action': 'load',
'repo_path': '.',
'backend-type': 'unknown'}) # only local or remote supported
except:
pass
@istest
def remote_loader(self):
"""Trigger loader and make sure everything is ok.
"""
# given
self.init_db_setup()
# given
commit0 = create_commit_with_content(self.tmp_git_repo, 'blob 0',
'commit msg 0')
commit1 = create_commit_with_content(self.tmp_git_repo, 'blob 1',
'commit msg 1',
[commit0.hex])
commit2 = create_commit_with_content(self.tmp_git_repo, 'blob 2',
'commit msg 2',
[commit1.hex])
commit3 = create_commit_with_content(self.tmp_git_repo, None,
'commit msg 3',
[commit2.hex])
commit4 = create_commit_with_content(self.tmp_git_repo, 'blob 4',
'commit msg 4',
[commit3.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf['content_storage_dir']))
self.assertEquals(nb_files, 4, "4 blobs")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
5,
"Should be 5 commits")
self.assertEquals(
models.count_directories(db_conn),
5,
"Should be 5 trees")
self.assertEquals(
models.count_contents(db_conn),
4,
"Should be 4 blobs as we created one commit without data!")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
1,
"Should be 1 reference (master) so 1 occurrence.")
# given
commit5 = create_commit_with_content(self.tmp_git_repo, 'new blob 5',
'commit msg 5',
[commit4.hex])
commit6 = create_commit_with_content(self.tmp_git_repo,
'new blob and last 6',
'commit msg 6',
[commit5.hex])
commit7 = create_commit_with_content(self.tmp_git_repo, 'new blob 7',
'commit msg 7',
[commit6.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf['content_storage_dir']))
self.assertEquals(nb_files, 4+3, "3 new blobs")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
8,
"Should be 5+3 == 8 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 5+3 == 8 trees")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 4+3 == 7 blobs")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
2,
"Should be 1 reference which changed twice so 2 occurrences (master changed).")
# given
create_commit_with_content(self.tmp_git_repo, None,
'commit 8 with parent 2',
[commit7.hex])
# when
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf['content_storage_dir']))
self.assertEquals(nb_files, 7, "no new blob")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
9,
"Should be 8+1 == 9 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 8 trees (new commit without blob so no new tree)")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 7 blobs (new commit without new blob)")
self.assertEquals(
models.count_release(db_conn),
0,
"No tag created so 0 release.")
self.assertEquals(
models.count_occurrence(db_conn),
3,
"Should be 1 reference which changed thrice so 3 occurrences (master changed again).")
self.assertEquals(
models.count_person(db_conn),
2,
"1 author + 1 committer")
# add tag
create_tag(self.tmp_git_repo, '0.0.1', commit5, 'bad ass release 0.0.1, towards infinity...')
create_tag(self.tmp_git_repo, '0.0.2', commit7, 'release 0.0.2... and beyond')
loader.load(self.conf)
# then
nb_files = len(list_files_from(self.conf['content_storage_dir']))
self.assertEquals(nb_files, 7, "no new blob")
with db.connect(self.db_url) as db_conn:
self.assertEquals(
models.count_revisions(db_conn),
9,
"Should be 8+1 == 9 commits now")
self.assertEquals(
models.count_directories(db_conn),
8,
"Should be 8 trees (new commit without blob so no new tree)")
self.assertEquals(
models.count_contents(db_conn),
7,
"Should be 7 blobs (new commit without new blob)")
self.assertEquals(
models.count_release(db_conn),
2,
"Should be 2 annotated tags so 2 releases")
self.assertEquals(
models.count_occurrence(db_conn),
3,
"master did not change this time so still 3 occurrences")
self.assertEquals(
models.count_person(db_conn),
3,
"1 author + 1 committer + 1 tagger")
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Jul 3, 10:42 AM (1 w, 6 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3310170
Attached To
rDLDG Git loader
Event Timeline
Log In to Comment