6
6
7
7
8
8
def parse_emerge_output (output ):
9
- use_changes = re .findall (r'>=([^\s]+)\s+([^\n]+)' , output )
10
- use_changes = [(re .sub (r'-[0-9.]+(?:-r[0-9]+)?$' , '' , package ), flags ) for package , flags in use_changes ]
11
- return use_changes
9
+ use_changes = re .findall (r'>=([^\s]+)\s+([^\n]+)' , output )
10
+ use_changes = [(re .sub (r'-[0-9.]+(?:-r[0-9]+)?$' , '' , package ), flags )
11
+ for package , flags in use_changes ]
12
+ return use_changes
12
13
13
14
14
15
def update_package_use_custom (use_changes ):
15
- package_use_dir = '/etc/portage/package.use'
16
- custom_file_path = os .path .join (package_use_dir , 'custom' )
17
-
18
- if not os .path .exists (package_use_dir ):
19
- os .makedirs (package_use_dir )
20
-
21
- if not os .path .exists (custom_file_path ):
22
- open (custom_file_path , 'a' ).close ()
23
-
24
- with open (custom_file_path , 'r+' ) as f :
25
- content = f .read ()
26
- for package , flags in use_changes :
27
- if package not in content :
28
- f .write (f"{ package } { flags } \n " )
29
- print (f"Added to { custom_file_path } : { package } { flags } " )
30
- else :
31
- print (f"Package { package } already exists in { custom_file_path } " )
32
-
33
-
16
+ package_use_dir = '/etc/portage/package.use'
17
+ custom_file_path = os .path .join (package_use_dir , 'custom' )
18
+
19
+ if not os .path .exists (package_use_dir ):
20
+ os .makedirs (package_use_dir )
21
+
22
+ if not os .path .exists (custom_file_path ):
23
+ open (custom_file_path , 'a' ).close ()
24
+
25
+ with open (custom_file_path , 'r+' ) as f :
26
+ content = f .read ()
27
+ for package , flags in use_changes :
28
+ if package not in content :
29
+ f .write (f"{ package } { flags } \n " )
30
+ print (f"Added to { custom_file_path } : { package } { flags } " )
31
+ else :
32
+ print (f"Package { package } already exists in { custom_file_path } " )
33
+
34
+
34
35
def run_emerge_pretend_again (package_name ):
35
- try :
36
- result = subprocess .run (
37
- ['emerge' , '-pv' , '--autounmask-write=y' , package_name ],
38
- stdout = subprocess .PIPE ,
39
- stderr = subprocess .PIPE ,
40
- text = True ,
41
- check = True
42
- )
43
- return result . stdout
44
- except subprocess . CalledProcessError :
45
- update_command = [ 'etc-update' , '--automode' , '-5' ]
46
- subprocess . run ( update_command )
47
- return None
48
-
36
+ try :
37
+ result = subprocess .run (
38
+ ['emerge' , '-pv' , '--autounmask-write=y' , package_name ],
39
+ stdout = subprocess .PIPE ,
40
+ stderr = subprocess .PIPE ,
41
+ text = True ,
42
+ check = True )
43
+ return result . stdout
44
+ except subprocess . CalledProcessError :
45
+ update_command = [ 'etc-update' , '--automode' , '-5' ]
46
+ subprocess . run ( update_command )
47
+ return None
48
+
49
+
49
50
def run_emerge_pretend (package_name ):
50
- while True :
51
- try :
52
- result = subprocess .run (
53
- ['emerge' , '-pv' , '--autounmask-write=y' , package_name ],
54
- stdout = subprocess .PIPE ,
55
- stderr = subprocess .PIPE ,
56
- text = True ,
57
- check = True
58
- )
59
- return result . stdout
60
- except subprocess . CalledProcessError as e :
61
- if "have been masked." in e . stderr :
62
- return 1
63
- use_changes = parse_emerge_output ( e . stderr )
64
- update_package_use_custom ( use_changes )
65
- continue
51
+ while True :
52
+ try :
53
+ result = subprocess .run (
54
+ ['emerge' , '-pv' , '--autounmask-write=y' , package_name ],
55
+ stdout = subprocess .PIPE ,
56
+ stderr = subprocess .PIPE ,
57
+ text = True ,
58
+ check = True )
59
+ return result . stdout
60
+ except subprocess . CalledProcessError as e :
61
+ if "have been masked." in e . stderr :
62
+ return 1
63
+ use_changes = parse_emerge_output ( e . stderr )
64
+ update_package_use_custom ( use_changes )
65
+ continue
66
+
66
67
67
68
def extract_package_names (output ):
68
- pattern = re .compile (r'(\S+?/\S+?)(?=-\d+(?:\.\d+)*(?:[-:_][a-zA-Z0-9.]+)*)' )
69
- matches = pattern .findall (output )
70
-
71
- cleaned_matches = []
72
- for match in matches :
73
- if '/' in match and not match .endswith ('/' ):
74
- cleaned_matches .append (match )
75
-
76
- return cleaned_matches
69
+ pattern = re .compile (r'(\S+?/\S+?)(?=-\d+(?:\.\d+)*(?:[-:_][a-zA-Z0-9.]+)*)' )
70
+ matches = pattern .findall (output )
71
+
72
+ cleaned_matches = []
73
+ for match in matches :
74
+ if '/' in match and not match .endswith ('/' ):
75
+ cleaned_matches .append (match )
76
+
77
+ return cleaned_matches
78
+
77
79
78
80
def create_json_file (package ):
79
- _ , name = package .split ('/' )
80
- name_with_slash = package .replace ('/' , '_' )
81
- json_content = {
82
- "sources" : [],
83
- "folder_name" : name_with_slash ,
84
- "build_system" : "portage" ,
85
- "package_name" : name ,
86
- "package_spec" : package
87
- }
81
+ _ , name = package .split ('/' )
82
+ name_with_slash = package .replace ('/' , '_' )
83
+ json_content = {
84
+ "sources" : [],
85
+ "folder_name" : name_with_slash ,
86
+ "build_system" : "portage" ,
87
+ "package_name" : name ,
88
+ "package_spec" : package
89
+ }
88
90
89
- json_filename = f"/data/database/json/portage_{ name_with_slash } .json"
90
- os .makedirs (os .path .dirname (json_filename ), exist_ok = True )
91
+ json_filename = f"/data/database/json/portage_{ name_with_slash } .json"
92
+ os .makedirs (os .path .dirname (json_filename ), exist_ok = True )
91
93
92
- with open (json_filename , 'w' ) as json_file :
93
- json .dump (json_content , json_file , indent = 2 )
94
+ with open (json_filename , 'w' ) as json_file :
95
+ json .dump (json_content , json_file , indent = 2 )
96
+
97
+ return json_filename
94
98
95
- return json_filename
96
99
97
100
def run_corpus_command (json_filename ):
98
- command = [
99
- 'python3' , './llvm_ir_dataset_utils/tools/corpus_from_description.py' ,
100
- '--source_dir=/data/database-1/source' ,
101
- '--corpus_dir=/data/database-1/corpus' ,
102
- '--build_dir=/data/database-1/build' ,
103
- f'--corpus_description={ json_filename } '
104
- ]
105
- try :
106
- subprocess .run (command , check = True )
107
- return 0
108
- except subprocess .CalledProcessError :
109
- return 1
101
+ command = [
102
+ 'python3' , './llvm_ir_dataset_utils/tools/corpus_from_description.py' ,
103
+ '--source_dir=/data/database-1/source' ,
104
+ '--corpus_dir=/data/database-1/corpus' ,
105
+ '--build_dir=/data/database-1/build' ,
106
+ f'--corpus_description={ json_filename } '
107
+ ]
108
+ try :
109
+ subprocess .run (command , check = True )
110
+ return 0
111
+ except subprocess .CalledProcessError :
112
+ return 1
113
+
110
114
111
115
def build (target_package ):
112
- installed_packages = []
113
- # Skip finished packages.
114
- with open ('../../corpus_descriptions_test/finished.list' , 'r' ) as installed_list :
115
- for i in installed_list :
116
- installed_packages .append (i [:- 1 ])
117
-
118
- output = run_emerge_pretend (target_package )
119
- if output == 1 :
120
- print (f"{ target_package } has been masked" )
121
- return
122
- if output :
123
- package_names = extract_package_names (output )
124
- if target_package .replace ('/' , '_' ) in installed_packages or \
125
- os .path .exists ('/data/database-1/corpus/' + target_package .replace ('/' , '_' )):
126
- return
127
- for package in package_names :
128
- package_use_dir = '/etc/portage/package.use'
129
- custom_file_path = os .path .join (package_use_dir , 'custom' )
130
- if os .path .exists (custom_file_path ):
131
- os .remove (custom_file_path )
132
- name_with_slash = package .replace ('/' , '_' )
133
- if name_with_slash in installed_packages or os .path .exists ('/data/database-1/corpus/' + name_with_slash ):
134
- renew_command = ['emerge' , '--quiet' ]
135
- renew_command .append (package )
136
- try :
137
- subprocess .run (renew_command , check = True )
138
- except subprocess .CalledProcessError :
139
- print ("Error to build depedency." )
140
- continue
141
- json_filename = create_json_file (package )
142
- run_corpus_command (json_filename )
116
+ installed_packages = []
117
+ # Skip finished packages.
118
+ with open ('../../corpus_descriptions_test/finished.list' ,
119
+ 'r' ) as installed_list :
120
+ for i in installed_list :
121
+ installed_packages .append (i [:- 1 ])
122
+
123
+ output = run_emerge_pretend (target_package )
124
+ if output == 1 :
125
+ print (f"{ target_package } has been masked" )
126
+ return
127
+ if output :
128
+ package_names = extract_package_names (output )
129
+ if target_package .replace ('/' , '_' ) in installed_packages or \
130
+ os .path .exists ('/data/database-1/corpus/' + target_package .replace ('/' , '_' )):
131
+ return
132
+ for package in package_names :
133
+ package_use_dir = '/etc/portage/package.use'
134
+ custom_file_path = os .path .join (package_use_dir , 'custom' )
135
+ if os .path .exists (custom_file_path ):
136
+ os .remove (custom_file_path )
137
+ name_with_slash = package .replace ('/' , '_' )
138
+ if name_with_slash in installed_packages or os .path .exists (
139
+ '/data/database-1/corpus/' + name_with_slash ):
140
+ renew_command = ['emerge' , '--quiet' ]
141
+ renew_command .append (package )
142
+ try :
143
+ subprocess .run (renew_command , check = True )
144
+ except subprocess .CalledProcessError :
145
+ print ("Error to build depedency." )
146
+ continue
147
+ json_filename = create_json_file (package )
148
+ run_corpus_command (json_filename )
143
149
144
150
145
151
if __name__ == "__main__" :
146
- if len (sys .argv ) != 3 :
147
- sys .exit (0 )
152
+ if len (sys .argv ) != 3 :
153
+ sys .exit (0 )
148
154
149
- try :
150
- a = int (sys .argv [1 ])
151
- b = int (sys .argv [2 ])
152
- except ValueError :
153
- print ("Please provide integer values for <a> and <b>." )
154
- sys .exit (1 )
155
-
156
- with open ('../../corpus_descriptions_test/portage_pkg.list' , 'r' ) as file :
157
- for i , package_name in enumerate (file ):
158
- if i < a :
159
- continue
160
- if i >= b :
161
- break
162
- package_name = package_name .strip ()
163
- package_name = package_name .replace ('_' ,'/' ,1 )
164
- build (package_name )
155
+ try :
156
+ a = int (sys .argv [1 ])
157
+ b = int (sys .argv [2 ])
158
+ except ValueError :
159
+ print ("Please provide integer values for <a> and <b>." )
160
+ sys .exit (1 )
161
+
162
+ with open ('../../corpus_descriptions_test/portage_pkg.list' , 'r' ) as file :
163
+ for i , package_name in enumerate (file ):
164
+ if i < a :
165
+ continue
166
+ if i >= b :
167
+ break
168
+ package_name = package_name .strip ()
169
+ package_name = package_name .replace ('_' , '/' , 1 )
170
+ build (package_name )
0 commit comments