-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun_rlc_with_inference.py
More file actions
153 lines (137 loc) · 6.26 KB
/
run_rlc_with_inference.py
File metadata and controls
153 lines (137 loc) · 6.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import os
import logging
import argparse
import time
from RLCRunner import RLCRunner
from FieldEnhancementRunner import FieldEnhancementRunner
from CloseInjector import CloseInjector
from OwningFieldModifier import run_owning_field_plugin, check_for_owning_patch
from BenchmarkCleaner import BenchmarkCleaner
from utils import (
create_folder_if_not_exists,
store_inference_results,
store_patch_and_log_files,
clean_up_current,
run_rlfixer
)
from CloseInjector import CloseInjector
import Constants
from RLPatcherRunner import run_rlpatcher_for_project
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
def run_arodnap():
results_folder = f"{Constants.RESULTS_BASE_FOLDER}"
create_folder_if_not_exists(results_folder)
rlc_runner = RLCRunner(results_folder, run_rlc_inference=True)
start_time = time.perf_counter()
source_project_name = os.path.basename(
Constants.SOURCE_PROJECT_FOLDER.rstrip('/'))
logging.info(f"Running on {source_project_name}...")
BenchmarkCleaner.restore_benchmark(Constants.SOURCE_PROJECT_FOLDER)
# Convert the source files to Unix line endings
os.system(f"cd {Constants.SOURCE_PROJECT_FOLDER}/src" +
" && find . -type f -name \"*.java\" -exec dos2unix {} + > /dev/null 2>&1")
# FieldEnhancementRunner.run_field_enhancements(
# source_project_name, Constants.SOURCE_PROJECT_FOLDER)
rlc_runner.run_cf_analysis(
source_project_name, Constants.SOURCE_PROJECT_FOLDER)
store_inference_results(
Constants.SOURCE_PROJECT_FOLDER, f"{Constants.PATCH_AND_LOGS_FOLDER}/{source_project_name}", stage="initial")
return
CloseInjector.run_close_injector(
source_project_name, Constants.SOURCE_PROJECT_FOLDER, results_folder)
if CloseInjector.check_for_close_injector_patch(Constants.SOURCE_PROJECT_FOLDER):
logging.info(
"Close Injector patch detected. Rerunning CF analysis before running RLFixer...")
rlc_runner.run_cf_analysis(
source_project_name, Constants.SOURCE_PROJECT_FOLDER, is_rerun=True)
store_inference_results(
Constants.SOURCE_PROJECT_FOLDER, f"{Constants.PATCH_AND_LOGS_FOLDER}/{source_project_name}", stage="close_injector")
if os.path.exists(results_folder + "_ReRun/" + source_project_name + ".txt"):
results_folder = results_folder + "_ReRun"
logging.info(
f"Running owning field modifier plugin on {source_project_name}.")
run_owning_field_plugin(
f"{results_folder}/{source_project_name}.txt",
Constants.SOURCE_PROJECT_FOLDER,
)
if check_for_owning_patch(Constants.SOURCE_PROJECT_FOLDER):
logging.info("Owning patch detected. Rerunning CF analysis again.")
rlc_runner.run_cf_analysis(
source_project_name, Constants.SOURCE_PROJECT_FOLDER, is_rerun=True)
store_inference_results(
Constants.SOURCE_PROJECT_FOLDER, f"{Constants.PATCH_AND_LOGS_FOLDER}/{source_project_name}", stage="close_injector")
run_rlfixer(source_project_name, results_folder,
Constants.SOURCE_PROJECT_FOLDER)
elapsed_time = time.perf_counter() - start_time
logging.info(
f"Time taken for {source_project_name}: {elapsed_time:.2f} seconds")
store_patch_and_log_files(
f"{Constants.PATCH_AND_LOGS_FOLDER}/{source_project_name}")
logging.info(f"Invoking RLPatcher for materialization for {source_project_name}...")
# Put patches under: tool_results/inference_and_patches/<project>/rlpatcher_patches
rlpatcher_out_dir = os.path.join(
Constants.PATCH_AND_LOGS_FOLDER,
source_project_name,
"rlpatcher_patches"
)
run_rlpatcher_for_project(
project_name=source_project_name,
rlc_results_folder=results_folder, # NOTE: may already be *_ReRun
rlfixer_results_folder=Constants.RLFIXER_RESULTS_FOLDER,
rlpatcher_jar=Constants.RLPATCHER_JAR,
out_dir=rlpatcher_out_dir,
success_text="Patch applied successfully",
keep_temp_json=False,
)
clean_up_current()
print()
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Run RLC experiments",
epilog=(
"Any of the following path arguments, if omitted,\n"
"will default to the current working directory:\n"
" --source_project_folder, --rlc_results_folder,\n"
" --rlfixer_results_folder, --patch_and_logs_folder"
)
)
parser.add_argument(
"--source_project_folder", "-s",
help="the path to the source projects root folder",
required=True
)
parser.add_argument(
"--rlc_results_folder", "-r",
help="rlc results folder",
)
parser.add_argument(
"--rlfixer_results_folder", "-f",
help="rlfixer results folder",
)
parser.add_argument(
"--patch_and_logs_folder", "-p",
help="the path to the patch and logs folder",
)
args = parser.parse_args()
Constants.SOURCE_PROJECT_FOLDER = os.path.normpath(
args.source_project_folder)
if not os.path.exists(Constants.SOURCE_PROJECT_FOLDER):
raise FileNotFoundError(
f"Source project folder does not exist: {Constants.SOURCE_PROJECT_FOLDER}")
Constants.RESULTS_BASE_FOLDER = args.rlc_results_folder if args.rlc_results_folder else Constants.RESULTS_BASE_FOLDER
Constants.RLFIXER_RESULTS_FOLDER = args.rlfixer_results_folder if args.rlfixer_results_folder else Constants.RLFIXER_RESULTS_FOLDER
Constants.PATCH_AND_LOGS_FOLDER = args.patch_and_logs_folder if args.patch_and_logs_folder else Constants.PATCH_AND_LOGS_FOLDER
create_folder_if_not_exists(Constants.RESULTS_BASE_FOLDER)
create_folder_if_not_exists(Constants.RLFIXER_RESULTS_FOLDER)
create_folder_if_not_exists(Constants.PATCH_AND_LOGS_FOLDER)
Constants.RLFIXER_RESULTS_FOLDER = os.path.abspath(
Constants.RLFIXER_RESULTS_FOLDER)
logging.info(f"Source project folder: {Constants.SOURCE_PROJECT_FOLDER}")
logging.info(f"RLC results folder: {Constants.RESULTS_BASE_FOLDER}")
logging.info(f"RLFixer results folder: {Constants.RLFIXER_RESULTS_FOLDER}")
logging.info(f"Patch and logs folder: {Constants.PATCH_AND_LOGS_FOLDER}")
run_arodnap()