Mercurial > repos > damion > versioned_data
comparison data_stores/vdb_git.py @ 1:5c5027485f7d draft
Uploaded correct file
| author | damion |
|---|---|
| date | Sun, 09 Aug 2015 16:07:50 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:d31a1bd74e63 | 1:5c5027485f7d |
|---|---|
| 1 #!/usr/bin/python | |
| 2 ## ********************************* GIT ARCHIVE ******************************* | |
| 3 ## | |
| 4 | |
| 5 import os, sys | |
| 6 import vdb_common | |
| 7 import vdb_data_stores | |
| 8 import subprocess | |
| 9 import datetime | |
| 10 | |
| 11 class VDBGitDataStore(vdb_data_stores.VDBDataStore): | |
| 12 | |
| 13 def __init__(self, retrieval_obj, spec_file_id): | |
| 14 """ | |
| 15 Archive is expected to be in "master/" subfolder of data_store_path on server. | |
| 16 """ | |
| 17 super(VDBGitDataStore, self).__init__(retrieval_obj, spec_file_id) | |
| 18 self.command = 'git' | |
| 19 gitPath = self.data_store_path + 'master/' | |
| 20 if not os.path.isdir(os.path.join(gitPath,'.git') ): | |
| 21 print "Error: Unable to locate git archive file: " + gitPath | |
| 22 sys.exit(1) | |
| 23 | |
| 24 command = [self.command, '--git-dir=' + gitPath + '.git', '--work-tree=' + gitPath, 'for-each-ref','--sort=-*committerdate', "--format=%(*committerdate:raw) %(refname)"] | |
| 25 # to list just 1 id: command.append('refs/tags/' + version_id) | |
| 26 # git --git-dir=/.../NCBI_16S/master/.git --work-tree=/.../NCBI_16S/master/ tag | |
| 27 items, error = subprocess.Popen(command,stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() | |
| 28 items = items.split("\n") #Loop through list of tags | |
| 29 versions = [] | |
| 30 for ptr, item in enumerate(items): | |
| 31 | |
| 32 # Ignore master branch name; time is included as separate field in all other cases | |
| 33 if item.strip().find(" ") >0: | |
| 34 (vtime, voffset, name) = item.split(" ") | |
| 35 created = vdb_common.get_unix_time(vtime, voffset) | |
| 36 item_name = name[10:] #strip 'refs/tags/' part off | |
| 37 versions.append({'name':item_name, 'id':item_name, 'created': created}) | |
| 38 | |
| 39 self.versions = versions | |
| 40 | |
| 41 | |
| 42 def get_version(self, version_name): | |
| 43 """ | |
| 44 Returns server folder path to version folder containing git files for a given version_id (git tag) | |
| 45 | |
| 46 FUTURE: TO AVOID USE CONFLICTS FOR VERSION RETRIEVAL, GIT CLONE INTO TEMP FOLDER | |
| 47 with -s / --shared and -n / --no-checkout (to avoid head build) THEN CHECKOUT version | |
| 48 ... | |
| 49 REMOVE CLONE GIT REPO | |
| 50 | |
| 51 @param galaxy_instance object A Bioblend galaxy instance | |
| 52 @param library_id string Identifier for a galaxy data library | |
| 53 @param library_label_path string Full hierarchic label of a library file or folder, PARENT of version id folder. | |
| 54 | |
| 55 @param base_folder_id string a library folder id under which version files should exist | |
| 56 @param version_id alphaneumeric string (git tag) | |
| 57 | |
| 58 """ | |
| 59 version = self.get_metadata_version(version_name) | |
| 60 | |
| 61 if not version: | |
| 62 print 'Error: Galaxy was not able to find the given version id in the %s data store.' % self.version_path | |
| 63 sys.exit( 1 ) | |
| 64 | |
| 65 version_name = version['name'] | |
| 66 self.version_path = os.path.join(self.data_store_path, version_name) | |
| 67 self.version_label = vdb_common.lightDate(version['created']) + '_v' + version_name | |
| 68 self.library_version_path = os.path.join(self.library_label_path, self.version_label) | |
| 69 | |
| 70 # If Data Library Versioned Data folder doesn't exist for this version, then create it | |
| 71 if not os.path.exists(self.version_path): | |
| 72 try: | |
| 73 os.mkdir(self.version_path) | |
| 74 except: | |
| 75 print 'Error: Galaxy was not able to create data store folder "%s". Check permissions?' % self.version_path | |
| 76 sys.exit( 1 ) | |
| 77 | |
| 78 if os.listdir(self.version_path) == []: | |
| 79 | |
| 80 git_path = self.data_store_path + 'master/' | |
| 81 # RETRIEVE LIST OF FILES FOR GIVEN GIT TAG (using "ls-tree". | |
| 82 # It can happen independently of git checkout) | |
| 83 | |
| 84 command = [self.command, '--git-dir=%s/.git' % git_path, 'ls-tree','--name-only','-r', version_name] | |
| 85 items, error = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() | |
| 86 git_files = items.split('\n') | |
| 87 | |
| 88 # PERFORM GIT CHECKOUT | |
| 89 command = [self.command, '--git-dir=%s/.git' % git_path, '--work-tree=%s' % git_path, 'checkout', version_name] | |
| 90 results, error = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() | |
| 91 | |
| 92 vdb_common.move_files(git_path, self.version_path, git_files) | |
| 93 | |
| 94 | |
| 95 | |
| 96 def get_metadata_version(self, version_name=''): | |
| 97 if version_name == '': | |
| 98 return self.versions[0] | |
| 99 | |
| 100 for version in self.versions: | |
| 101 if str(version['name']) == version_name: | |
| 102 return version | |
| 103 | |
| 104 return False | |
| 105 | |
| 106 |
