# Copyright 2014 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import os import sys import uuid import distixlib class Repository(object): def __init__(self, dirname): self._dirname = dirname def invent_new_ticket_id(self): return uuid.uuid4().hex def create(self, description): git = distixlib.Git(self._dirname) git.init() filenames = self._create_repo_yaml(description) self.commit_changes(filenames, 'distix initial commit') def _create_repo_yaml(self, description): metadata = distixlib.Metadata() metadata.add('description', description) filename = os.path.join(self._dirname, 'repo.yaml') saver = distixlib.MetadataSaver() saver.save_to_file(filename, metadata) return [filename] def require_clean_working_tree(self, stderr=sys.stderr): states = { '??': 'unknown', 'M': 'modified', } git = distixlib.Git(self._dirname) dirt = git.find_dirt() if dirt: stderr.write('ERROR: unclean repository:\n') for speck in dirt: status = speck[:2].strip() filename = speck[3:].strip() stderr.write( ' {}: {}\n'.format(states.get(status, status), filename)) sys.exit(1) def get_description(self): loader = distixlib.MetadataLoader() filename = os.path.join(self._dirname, 'repo.yaml') metadata = loader.load_from_file(filename) return metadata.get_first_value('description') def open_ticket_store(self, relative_dirname): joined_pathname = os.path.join(self._dirname, relative_dirname) return distixlib.TicketStore(joined_pathname) def commit_changes(self, filenames, msg): # pragma: no cover filenames = [ os.path.relpath(filename, self._dirname) for filename in filenames] git = distixlib.Git(self._dirname) git.add_and_commit(filenames, msg)