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