diff options
author | Erik Fonnesbeck <efonnes@gmail.com> | 2010-09-16 00:53:24 -0600 |
---|---|---|
committer | Erik Fonnesbeck <efonnes@gmail.com> | 2010-09-16 02:40:17 -0600 |
commit | 97e6256f4d611b7edbfa12d3c03cf9b6cca9e3c1 (patch) | |
tree | 0b69d0c2d3c192774834985793248712fd260efa | |
parent | 9bc8788aa9eb28c39ce204a51a341b3d5586f3d7 (diff) | |
download | pfsense-97e6256f4d611b7edbfa12d3c03cf9b6cca9e3c1.zip pfsense-97e6256f4d611b7edbfa12d3c03cf9b6cca9e3c1.tar.gz |
Add support for an automatic merge list to gitsync, properly escape user-supplied parameters, and improve error handling a bit.
-rw-r--r-- | etc/phpshellsessions/gitsync | 51 | ||||
-rw-r--r-- | root/.gitsync_merge.sample | 3 |
2 files changed, 43 insertions, 11 deletions
diff --git a/etc/phpshellsessions/gitsync b/etc/phpshellsessions/gitsync index 09cb670..5efa4d7 100644 --- a/etc/phpshellsessions/gitsync +++ b/etc/phpshellsessions/gitsync @@ -1,6 +1,7 @@ /* cvs_sync * Written by Scott Ullrich * (C)2005-2007 Scott Ullrich + * (C)2010 Erik Fonnesbeck * Part of the pfSense project pfSsh.php subsystem */ @@ -119,9 +120,31 @@ if(!$found) { } $merge_repos = array(); +if(file_exists("/root/.gitsync_merge")) { + $gitsync_merges = file("/root/.gitsync_merge", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if(!empty($gitsync_merges) && is_array($gitsync_merges)) { + echo "\n===> Automatic merge list read from /root/.gitsync_merge\n"; + foreach($gitsync_merges as $merge_line_num => $merge_line) { + $merge_comments = explode("#", trim($merge_line)); + if(empty($merge_comments[0])) + continue; + + $merge_line = explode(" ", trim($merge_comments[0])); + if(count($merge_line) != 2 || empty($merge_line[0]) || empty($merge_line[1])) { + echo "\nLine " . ($merge_line_num + 1) . " does not have the correct parameter count or has improper spacing.\n"; + echo "Expected parameters: repository_url branch\n"; + echo "Line read: " . implode(" ", $merge_line) . "\n\n"; + echo "Aborting automatic merge.\n\n"; + $merge_repos = array(); + break; + } + $merge_repos[] = array('repo' => $merge_line[0], 'branch' => $merge_line[1]); + } + } +} if(!$command_split[2] && !$argv[3]) { do { - echo "\nAdd a custom RCS branch URL (HTTP) to merge in or press enter for none.\n\n"; + echo "\nAdd a custom RCS branch URL (HTTP) to merge in or press enter if done.\n\n"; $merge_repo = readline("> "); if(!empty($merge_repo)) { $merge_branch = readline("Merge which branch [master]? "); @@ -162,29 +185,29 @@ echo "===> Checking out $branch\n"; // Git commands for resetting to the specified branch if($branch == "build_commit") { $git_cmd = array( - "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch $branch 2>/dev/null", - "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f $branch 2>/dev/null", + "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch " . escapeshellarg($branch) . " 2>/dev/null", + "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f " . escapeshellarg($branch) . " 2>/dev/null", "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard `cat /etc/version.lastcommit`" ); } else { $git_cmd = array( - "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch $branch origin/$branch 2>/dev/null", - "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f $branch 2>/dev/null", - "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard origin/$branch" + "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git branch " . escapeshellarg($branch) . " " . escapeshellarg("origin/{$branch}") . " 2>/dev/null", + "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git checkout -f " . escapeshellarg($branch) . " 2>/dev/null", + "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard " . escapeshellarg("origin/{$branch}") ); } // Git 'er done! if(is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) { echo "===> Fetching updates...\n"; - exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url $GIT_REPO"); + exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url " . escapeshellarg($GIT_REPO)); exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git fetch"); exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git clean -f -f -x -d"); run_cmds($git_cmd); } else { exec("mkdir -p $CODIR/pfSenseGITREPO"); echo "Executing cd $CODIR/pfSenseGITREPO && git clone $GIT_REPO pfSenseGITREPO\n"; - exec("cd $CODIR/pfSenseGITREPO && git clone $GIT_REPO pfSenseGITREPO"); + exec("cd $CODIR/pfSenseGITREPO && git clone " . escapeshellarg($GIT_REPO) . " pfSenseGITREPO"); if(is_dir("$CODIR/pfSenseGITREPO/pfSense")) exec("mv $CODIR/pfSenseGITREPO/pfSense $CODIR/pfSenseGITREPO/pfSenseGITREPO"); if(is_dir("$CODIR/pfSenseGITREPO/mainline")) @@ -194,7 +217,7 @@ if(is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) { foreach($merge_repos as $merge_repo) { echo "===> Merging branch {$merge_repo['branch']} from {$merge_repo['repo']}\n"; - exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git pull {$merge_repo['repo']} {$merge_repo['branch']}", $output_str, $ret); + exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git pull " . escapeshellarg($merge_repo['repo']) . " " . escapeshellarg($merge_repo['branch']), $output_str, $ret); unset($output_str); if($ret <> 0) { echo "\nMerge failed. Aborting sync.\n\n"; @@ -231,15 +254,21 @@ exec("rm -f ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/syslog.conf 2>/dev/null") echo "===> Installing new files...\n"; +// Don't include the .git directory in the copy +exec("mv $CODIR/pfSenseGITREPO/pfSenseGITREPO/.git $CODIR/pfSenseGITREPO/gitsync_temp.git"); + if($g['platform'] == "pfSense") $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - . | (cd / ; tar -Uxpf -)"; else $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - . | (cd / ; tar -xpf -) 2>/dev/null"; exec($command); -post_cvssync_commands(); +exec("mv $CODIR/pfSenseGITREPO/gitsync_temp.git $CODIR/pfSenseGITREPO/pfSenseGITREPO/.git"); + +// Reset the repository to restore the deleted files +exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && git reset --hard >/dev/null 2>/dev/null"); -run_cmds($git_cmd); +post_cvssync_commands(); echo "===> Checkout complete.\n"; echo "\n"; diff --git a/root/.gitsync_merge.sample b/root/.gitsync_merge.sample new file mode 100644 index 0000000..1c2606c --- /dev/null +++ b/root/.gitsync_merge.sample @@ -0,0 +1,3 @@ +# Sample automatic merge list for gitsync +# gitsync will automatically merge anything listed in /root/.gitsync_merge +http://repositorysite/my_repository.git my_branch |