def clone_repo(src, dest): """ Clone a repository. Arguments: src -- URL of to the repository to clone from. dest -- URL of the target directory of the clone. Returns: A clone of the supplied repository. """ src_connector = Connector.from_string(src) with src_connector.connected(): origin = repo.Repo.load_from_disk(src_connector) dest = os.path.join(dest, origin.name) # make clone at "<dest>/<name>" dest_connector = Connector.from_string(dest) with dest_connector.connected(): clone = repo.Repo.clone(origin, dest_connector) init_repo_logging(clone) log.info("Cloned repository from %s to %s" % (src, dest)) return clone
def load_repo(url): """ Load an existing repository from disk and return it. Arguments: url -- URL of the repository on disk. Returns: The loaded repository. """ connector = Connector.from_string(url) with connector.connected(): rep = repo.Repo.load_from_disk(connector) init_repo_logging(rep) log.info("Loaded PictureClerk repository from disk") return rep
def init_repo(url): """ Initialize a new repository and return it. Arguments: url -- URL of the repository to be initialized (e.g. '/home/user/repo'). Returns: The initialized repository. """ config = repo.new_repo_config() connector = Connector.from_string(url) with connector.connected(): rep = repo.Repo.create_on_disk(connector, config) init_repo_logging(rep) log.info("Initialized empty PictureClerk repository") return rep
def backup_repo(rep, *urls): """ Backup a repository to multiple locations. Arguments: rep -- Repository to be backed up urls -- Backup repository to these locations (1 or more URL args). Returns: Backup repositories (clones of the supplied respositories). """ backups = list() for url in urls: url = os.path.join(url, rep.name) connector = Connector.from_string(url) with rep.connector.connected(), connector.connected(): backup = repo.Repo.clone(rep, connector) init_repo_logging(backup) backups.append(backup) log.info("Backed up repository to %s" % url) return backups
def merge_repos(rep, *others): """ Merge multiple repositories into one. Arguments: rep -- Merge 'others' repositories into this repository. others -- Path to repositories to merge into 'rep' (1 or more path args). """ with rep.connector.connected(): for url in others: log.info("Merging repository '%s'", url) connector = Connector.from_string(url) with connector.connected(): other = repo.Repo.load_from_disk(connector) # copy picture files for picture in other.index.iterpics(): for fname in picture.get_filenames(): connector.copy(fname, rep.connector, dest_path=fname) # add pictures to index rep.index.add(other.index.iterpics()) log.info("Saving index to file.") with rep.connector.connected(): rep.save_index_to_disk() return rep