Project

General

Profile

« Previous | Next » 

Revision 97e6256f

Added by Erik Fonnesbeck almost 15 years ago

Add support for an automatic merge list to gitsync, properly escape user-supplied parameters, and improve error handling a bit.

View differences:

etc/phpshellsessions/gitsync
1 1
/*   cvs_sync
2 2
 *   Written by Scott Ullrich
3 3
 *   (C)2005-2007 Scott Ullrich
4
 *   (C)2010 Erik Fonnesbeck
4 5
 *   Part of the pfSense project pfSsh.php subsystem
5 6
 */
6 7

  
......
119 120
}
120 121

  
121 122
$merge_repos = array();
123
if(file_exists("/root/.gitsync_merge")) {
124
	$gitsync_merges = file("/root/.gitsync_merge", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
125
	if(!empty($gitsync_merges) && is_array($gitsync_merges)) {
126
		echo "\n===> Automatic merge list read from /root/.gitsync_merge\n";
127
		foreach($gitsync_merges as $merge_line_num => $merge_line) {
128
			$merge_comments = explode("#", trim($merge_line));
129
			if(empty($merge_comments[0]))
130
				continue;
131

  
132
			$merge_line = explode(" ", trim($merge_comments[0]));
133
			if(count($merge_line) != 2 || empty($merge_line[0]) || empty($merge_line[1])) {
134
				echo "\nLine " . ($merge_line_num + 1) . " does not have the correct parameter count or has improper spacing.\n";
135
				echo "Expected parameters:  repository_url branch\n";
136
				echo "Line read:  " . implode(" ", $merge_line) . "\n\n";
137
				echo "Aborting automatic merge.\n\n";
138
				$merge_repos = array();
139
				break;
140
			}
141
			$merge_repos[] = array('repo' => $merge_line[0], 'branch' => $merge_line[1]);
142
		}
143
	}
144
}
122 145
if(!$command_split[2] && !$argv[3]) {
123 146
	do {
124
		echo "\nAdd a custom RCS branch URL (HTTP) to merge in or press enter for none.\n\n";
147
		echo "\nAdd a custom RCS branch URL (HTTP) to merge in or press enter if done.\n\n";
125 148
		$merge_repo = readline("> ");
126 149
		if(!empty($merge_repo)) {
127 150
			$merge_branch = readline("Merge which branch [master]? ");
......
162 185
// Git commands for resetting to the specified branch
163 186
if($branch == "build_commit") {
164 187
	$git_cmd = array(
165
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch $branch 2>/dev/null",
166
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f $branch 2>/dev/null",
188
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch " . escapeshellarg($branch) . " 2>/dev/null",
189
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f " . escapeshellarg($branch) . " 2>/dev/null",
167 190
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard `cat /etc/version.lastcommit`"
168 191
	);
169 192
} else {
170 193
	$git_cmd = array(
171
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch $branch origin/$branch 2>/dev/null",
172
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f $branch 2>/dev/null",
173
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard origin/$branch"
194
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch " . escapeshellarg($branch) . " " . escapeshellarg("origin/{$branch}") . " 2>/dev/null",
195
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f " . escapeshellarg($branch) . " 2>/dev/null",
196
		"cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard " . escapeshellarg("origin/{$branch}")
174 197
	);
175 198
}
176 199

  
177 200
// Git 'er done!
178 201
if(is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) {
179 202
	echo "===> Fetching updates...\n";
180
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url $GIT_REPO");
203
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url " . escapeshellarg($GIT_REPO));
181 204
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git fetch");
182 205
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git clean -f -f -x -d");
183 206
	run_cmds($git_cmd);
184 207
} else {
185 208
    exec("mkdir -p $CODIR/pfSenseGITREPO");
186 209
    echo "Executing cd $CODIR/pfSenseGITREPO && git clone $GIT_REPO pfSenseGITREPO\n";
187
	exec("cd $CODIR/pfSenseGITREPO && git clone $GIT_REPO pfSenseGITREPO");
210
	exec("cd $CODIR/pfSenseGITREPO && git clone " . escapeshellarg($GIT_REPO) . " pfSenseGITREPO");
188 211
	if(is_dir("$CODIR/pfSenseGITREPO/pfSense")) 
189 212
		exec("mv $CODIR/pfSenseGITREPO/pfSense $CODIR/pfSenseGITREPO/pfSenseGITREPO");
190 213
	if(is_dir("$CODIR/pfSenseGITREPO/mainline")) 
......
194 217

  
195 218
foreach($merge_repos as $merge_repo) {
196 219
	echo "===> Merging branch {$merge_repo['branch']} from {$merge_repo['repo']}\n";
197
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git pull {$merge_repo['repo']} {$merge_repo['branch']}", $output_str, $ret);
220
	exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git pull " . escapeshellarg($merge_repo['repo']) . " " . escapeshellarg($merge_repo['branch']), $output_str, $ret);
198 221
	unset($output_str);
199 222
	if($ret <> 0) {
200 223
		echo "\nMerge failed.  Aborting sync.\n\n";
......
231 254

  
232 255
echo "===> Installing new files...\n";
233 256

  
257
// Don't include the .git directory in the copy
258
exec("mv $CODIR/pfSenseGITREPO/pfSenseGITREPO/.git $CODIR/pfSenseGITREPO/gitsync_temp.git");
259

  
234 260
if($g['platform'] == "pfSense") 
235 261
	$command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - . | (cd / ; tar -Uxpf -)";
236 262
else 
237 263
	$command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - . | (cd / ; tar -xpf -) 2>/dev/null";
238 264
exec($command);
239 265

  
240
post_cvssync_commands();
266
exec("mv $CODIR/pfSenseGITREPO/gitsync_temp.git $CODIR/pfSenseGITREPO/pfSenseGITREPO/.git");
267

  
268
// Reset the repository to restore the deleted files
269
exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard >/dev/null 2>/dev/null");
241 270

  
242
run_cmds($git_cmd);
271
post_cvssync_commands();
243 272

  
244 273
echo "===> Checkout complete.\n";
245 274
echo "\n";
root/.gitsync_merge.sample
1
# Sample automatic merge list for gitsync
2
# gitsync will automatically merge anything listed in /root/.gitsync_merge
3
http://repositorysite/my_repository.git my_branch

Also available in: Unified diff