-
Notifications
You must be signed in to change notification settings - Fork 0
/
GitCmdSUL.py
112 lines (96 loc) · 4.61 KB
/
GitCmdSUL.py
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
import os
import subprocess
from aalpy.base import SUL
from utils import clean_up, create_file, change_file, delete_file
def execute_git_command(command, cwd):
try:
result = subprocess.run(command, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
return True
else:
return False
except Exception:
return False
class GitCmdSUL(SUL):
def __init__(self, repo_path, bare_repo_path, change_uses_random_test=True, allow_empty_commit=False, verbose=True):
super().__init__()
# absolute paths to ensure folder deletion
self.repo_path = os.path.abspath(repo_path)
self.bare_repo_path = os.path.abspath(bare_repo_path)
# relative path from repo to bare repo to set the remote
self.path_to_bare_repo_from_repo = bare_repo_path.replace('tmp', '..')
self.change_uses_random_test = change_uses_random_test
self.allow_empty_commit = allow_empty_commit
# helper variables
self.filenames: list[str] = ['file0.txt', 'file1.txt']
self.branches = ['master', 'other_branch']
self.tag_number = 0
self.commit_number = 0
self.verbose = verbose
def pre(self):
# Initialize a bare repository as a local remote
subprocess.run(['git', 'init', '--bare', self.bare_repo_path], stdout=subprocess.DEVNULL)
# Initialize a new repository if it doesn't exist
subprocess.run(['git', 'init', self.repo_path], stdout=subprocess.DEVNULL)
# Add the remote
subprocess.run(['git', 'remote', 'add', 'origin', self.path_to_bare_repo_from_repo], cwd=self.repo_path)
def post(self):
self.tag_number = 0
self.commit_number = 0
clean_up(None, self.repo_path, self.bare_repo_path)
def query(self, word: tuple) -> list:
outputs = super(GitCmdSUL, self).query(word)
if self.verbose:
print(f'Current query and outputs: {list(zip(word, outputs))}')
return outputs
def step(self, letter):
file_command_status = None
# File operations
if letter == 'create_f0':
file_command_status = create_file(self.repo_path + '/' + self.filenames[0])
elif letter == 'create_f1':
file_command_status = create_file(self.repo_path + '/' + self.filenames[1])
elif letter == 'change_f0':
file_command_status = change_file(self.repo_path + '/' + self.filenames[0],
use_random_text=self.change_uses_random_test)
elif letter == 'change_f1':
file_command_status = change_file(self.repo_path + '/' + self.filenames[1],
use_random_text=self.change_uses_random_test)
elif letter == 'delete_f0':
file_command_status = delete_file(self.repo_path + '/' + self.filenames[0])
elif letter == 'delete_f1':
file_command_status = delete_file(self.repo_path + '/' + self.filenames[1])
if file_command_status is not None:
return 'PASS' if file_command_status else 'FAIL'
# Git commands
git_command = None
if letter == 'add_all':
git_command = ['git', 'add', '.']
elif letter == 'add_f0':
git_command = ['git', 'add', self.filenames[0]]
elif letter == 'add_f1':
git_command = ['git', 'add', self.filenames[1]]
elif letter == 'commit':
git_command = ['git', 'commit', '-m', f'Commit Number: {self.commit_number}']
if self.allow_empty_commit:
git_command.insert(2, '--allow-empty')
self.commit_number += 1
elif letter == 'tag':
git_command = ['git', 'tag', '-a', f'v.{self.tag_number}', '-m', 'Tag Message']
self.tag_number += 1
elif letter == 'fetch':
git_command = ['git', 'fetch',]
elif letter == 'pull':
git_command = ['git', 'pull', ]
elif letter == 'push':
git_command = ['git', 'push', '-u', 'origin', 'HEAD']
elif letter == 'create_branch':
git_command = ['git', 'branch', self.branches[1]]
elif letter == 'checkout_branch':
git_command = ['git', 'checkout', self.branches[1]]
elif letter == 'checkout_master':
git_command = ['git', 'checkout', self.branches[0]]
else:
raise ValueError(f'This letter is not part of the alphabet! Letter: {letter}')
git_command_status = execute_git_command(git_command, cwd=self.repo_path)
return 'PASS' if git_command_status else 'FAIL'