From 1fede6cad35c59d58683ccb8bc416e64bf53b985 Mon Sep 17 00:00:00 2001 From: Jarrett Jordaan Date: Thu, 8 Oct 2009 16:50:30 +0200 Subject: [PATCH] Story Id:1166869 Daily Commit --- setup/migrate/session.php | 2 +- setup/migrate/steps/migrateComplete.php | 5 +---- setup/migrate/steps/migrateDatabase.php | 2 +- setup/upgrade.php | 1124 ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ setup/wizard/lib/services/unixOpenOffice.php | 59 +++++++++++++++++++++++++++++++++++++++++++++-------------- setup/wizard/lib/system/openOffice.class | Bin 1047 -> 0 bytes setup/wizard/lib/system/openOffice.java | 5 +++-- setup/wizard/resources/js/wizard.js | 8 +++++++- setup/wizard/steps/complete.php | 9 ++++++++- setup/wizard/steps/database.php | 18 ++++++++++++++++++ setup/wizard/steps/install.php | 2 +- setup/wizard/templates/complete.tpl | 7 ++++++- 12 files changed, 93 insertions(+), 1148 deletions(-) diff --git a/setup/migrate/session.php b/setup/migrate/session.php index cea3d4b..35e7a7a 100644 --- a/setup/migrate/session.php +++ b/setup/migrate/session.php @@ -175,7 +175,7 @@ class Session * @access public * @return void */ - public function destroy() { + public function destroyMigrate() { $this->startSession(); unset($_SESSION[$this->salt]); session_destroy(); diff --git a/setup/migrate/steps/migrateComplete.php b/setup/migrate/steps/migrateComplete.php index 6419327..b341586 100644 --- a/setup/migrate/steps/migrateComplete.php +++ b/setup/migrate/steps/migrateComplete.php @@ -84,10 +84,7 @@ class migrateComplete extends Step { private function checkSqlDump() { $database = $this->getDataFromSession("database"); // Get installation directory // TODO - $sqlFile = $_SESSION['database']['dumpLocation']; -// $tmpFolder = $database['dumpLocation']; -// $sqlFile = $tmpFolder."dms.sql"; - //echo $sqlFile; + $sqlFile = $_SESSION['migrate']['database']['dumpLocation']; if(file_exists($sqlFile)) { $this->temp_variables['sql']['class'] = "tick"; $this->temp_variables['sql']['name'] = "dms.sql"; diff --git a/setup/migrate/steps/migrateDatabase.php b/setup/migrate/steps/migrateDatabase.php index 494bab1..267f363 100644 --- a/setup/migrate/steps/migrateDatabase.php +++ b/setup/migrate/steps/migrateDatabase.php @@ -301,7 +301,7 @@ function resolveTempDir() private function storeSilent() { // TODO - $_SESSION['database']['dumpLocation'] = $this->sqlDumpFile; + $_SESSION['migrate']['database']['dumpLocation'] = $this->sqlDumpFile; $this->temp_variables['dumpLocation'] = $this->sqlDumpFile; } diff --git a/setup/upgrade.php b/setup/upgrade.php index 1d74f05..d69b03f 100644 --- a/setup/upgrade.php +++ b/setup/upgrade.php @@ -35,1125 +35,5 @@ * Contributor( s): ______________________________________ * */ - -$GLOBALS["checkup"] = true; -session_start(); -require_once('../config/dmsDefaults.php'); -require_once(KT_LIB_DIR . '/authentication/authenticationutil.inc.php'); -require_once(KT_LIB_DIR . '/upgrades/upgrade.inc.php'); -require_once(KT_LIB_DIR . '/plugins/pluginutil.inc.php'); - -function generateUpgradeTable () { - global $default; - $query = sprintf('SELECT value FROM %s WHERE name = "databaseVersion"', $default->system_settings_table); - $lastVersion = DBUtil::getOneResultKey($query, 'value'); - $currentVersion = $default->systemVersion; - - $upgrades = describeUpgrade($lastVersion, $currentVersion); - - $ret = "\n"; - $ret .= "\n"; - $i=0; - foreach ($upgrades as $upgrade) { - $color=((($i++)%2)==0)?'white':'lightgrey'; - $ret .= sprintf("\n", - htmlspecialchars($upgrade->getDescriptor()), - htmlspecialchars($upgrade->getDescription()), - $upgrade->isAlreadyApplied() ? "Yes" : "No" - ); - } - $ret .= '
CodeDescriptionApplied
%s%s%s
'; - return $ret; -} - -function showResult($res) { - if (PEAR::isError($res)) { - if (is_a($res, 'Upgrade_Already_Applied')) { - return 'Already applied'; - } - return sprintf('%s', htmlspecialchars($res->toString())); - } - if ($res === true) { - return 'Success'; - } - if ($res === false) { - return 'Failure'; - } - return $res; -} - -$GLOBALS['row'] = 1; - -function performAllUpgrades () { - global $default; - $query = sprintf('SELECT value FROM %s WHERE name = "databaseVersion"', $default->system_settings_table); - $lastVersion = DBUtil::getOneResultKey($query, 'value'); - $currentVersion = $default->systemVersion; - - $upgrades = describeUpgrade($lastVersion, $currentVersion); - - foreach ($upgrades as $upgrade) { - if (($GLOBALS['row'] % 2) == 1) { - $class = "odd"; - } else { - $class = "even"; - } - printf('
%s
' . "\n", $class, htmlspecialchars($upgrade->getDescription())); - $GLOBALS['row']++; - ob_flush(); - flush(); - $res = $upgrade->performUpgrade(); - printf('
%s
', showResult($res)); - print '
' . "\n"; - ob_flush(); - flush(); - print "
\n"; - if (PEAR::isError($res)) { - if (!is_a($res, 'Upgrade_Already_Applied')) { - break; - } else { - $res = true; - } - } - if ($res === false) { - $res = PEAR::raiseError("Upgrade returned false"); - break; - } - } - - return $res; -} - -function performPreUpgradeActions() { - - // This is just to test and needs to be updated to a more sane and error resistent architrcture if it works. - // It should idealy work the same as the upgrades. - - global $default; - - // Lock the scheduler - $lockFile = $default->cacheDirectory . DIRECTORY_SEPARATOR . 'scheduler.lock'; - touch($lockFile); - return true; - -} - -function performPostUpgradeActions() { - - // This is just to test and needs to be updated to a more sane and error resistent architrcture if it works. - // It should idealy work the same as the upgrades. - - global $default; - - // Ensure all plugins are re-registered. - $sql = "TRUNCATE plugin_helper"; - $res = DBUtil::runQuery($sql); - - // Clear out all caches and proxies - they need to be regenerated with the new code - $proxyDir = $default->proxyCacheDirectory; - KTUtil::deleteDirectory($proxyDir); - - $oKTCache = new KTCache(); - $oKTCache->deleteAllCaches(); - - // Clear the configuration cache, it'll regenerate on next load - $oKTConfig = new KTConfig(); - $oKTConfig->clearCache(); - - // Unlock the scheduler - $lockFile = $default->cacheDirectory . DIRECTORY_SEPARATOR . 'scheduler.lock'; - if(file_exists($lockFile)){ - @unlink($lockFile); - } - - return true; - -} - -if (PEAR::isError($loggingSupport)) { - print '

Logging support is not currently working. Check post-installation checkup.

'; - exit(1); -} - -if (PEAR::isError($dbSupport)) { - print '

Database support is not currently working. Check post-installation checkup or refresh this page (F5) to try again.

'; - exit(1); -} - - - -?> - - - - <?php echo APP_NAME;?> Upgrade - - - - - -

- - -
-

- - -

-The database upgrade wizard completes the upgrade process on an existing installation. It applies -any upgrades to the database that may be required. -

-Only administrator users may access the upgrade wizard. -

- -

- -
Username -
Password -
-
-
-$message"; - login(); -} - -function resolveMysqlDir() -{ - // possibly detect existing installations: - - if (OS_UNIX) - { - $dirs = array('/opt/mysql/bin','/usr/local/mysql/bin'); - $mysqlname ='mysql'; - } - else - { - $dirs = explode(';', $_SERVER['PATH']); - $dirs[] ='c:/Program Files/MySQL/MySQL Server 5.0/bin'; - $dirs[] = 'c:/program files/ktdms/mysql/bin'; - $mysqlname ='mysql.exe'; - } - - $oKTConfig =& KTConfig::getSingleton(); - $mysqldir = $oKTConfig->get('backup/mysqlDirectory',$mysqldir); - $dirs[] = $mysqldir; - - if (strpos(__FILE__,'knowledgeTree') !== false && strpos(__FILE__,'ktdms') != false) - { - $dirs [] = realpath(dirname($FILE) . '/../../mysql/bin'); - } - - foreach($dirs as $dir) - { - if (is_file($dir . '/' . $mysqlname)) - { - return $dir; - } - } - - return ''; -} - - -function create_backup_stmt($targetfile=null) -{ - $oKTConfig =& KTConfig::getSingleton(); - - $adminUser = $oKTConfig->get('db/dbAdminUser'); - $adminPwd = $oKTConfig->get('db/dbAdminPass'); - $dbHost = $oKTConfig->get('db/dbHost'); - $dbName = $oKTConfig->get('db/dbName'); - - $dbPort = trim($oKTConfig->get('db/dbPort')); - if (empty($dbPort) || $dbPort=='default') $dbPort = get_cfg_var('mysql.default_port'); - if (empty($dbPort)) $dbPort='3306'; - $dbSocket = trim($oKTConfig->get('db/dbSocket')); - if (empty($dbSocket) || $dbSocket=='default') $dbSocket = get_cfg_var('mysql.default_socket'); - if (empty($dbSocket)) $dbSocket='../tmp/mysql.sock'; - - $date=date('Y-m-d-H-i-s'); - - $dir=resolveMysqlDir(); - - $info['dir']=$dir; - - $prefix=''; - if (OS_UNIX) - { - $prefix .= "./"; - } - - if (@stat($dbSocket) !== false) - { - $mechanism="--socket=\"$dbSocket\""; - } - else - { - $mechanism="--port=\"$dbPort\""; - } - - $tmpdir=resolveTempDir(); - - if (is_null($targetfile)) - { - $targetfile="$tmpdir/kt-backup-$date.sql"; - } - - $stmt = $prefix . "mysqldump --user=\"$adminUser\" -p $mechanism \"$dbName\" > \"$targetfile\""; - $info['display']=$stmt; - $info['target']=$targetfile; - - - $stmt = $prefix. "mysqldump --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism \"$dbName\" > \"$targetfile\""; - $info['cmd']=$stmt; - return $info; -} - -function create_restore_stmt($targetfile) -{ - $oKTConfig =& KTConfig::getSingleton(); - - $adminUser = $oKTConfig->get('db/dbAdminUser'); - $adminPwd = $oKTConfig->get('db/dbAdminPass'); - $dbHost = $oKTConfig->get('db/dbHost'); - $dbName = $oKTConfig->get('db/dbName'); - $dbPort = trim($oKTConfig->get('db/dbPort')); - if ($dbPort=='' || $dbPort=='default')$dbPort = get_cfg_var('mysql.default_port'); - if (empty($dbPort)) $dbPort='3306'; - $dbSocket = trim($oKTConfig->get('db/dbSocket')); - if (empty($dbSocket) || $dbSocket=='default') $dbSocket = get_cfg_var('mysql.default_socket'); - if (empty($dbSocket)) $dbSocket='../tmp/mysql.sock'; - - $dir=resolveMysqlDir(); - - $info['dir']=$dir; - - $prefix=''; - if (OS_UNIX) - { - $prefix .= "./"; - } - - if (@stat($dbSocket) !== false) - { - $mechanism="--socket=\"$dbSocket\""; - } - else - { - $mechanism="--port=\"$dbPort\""; - } - - $tmpdir=resolveTempDir(); - - $stmt = $prefix ."mysqladmin --user=\"$adminUser\" -p $mechanism drop \"$dbName\"
"; - $stmt .= $prefix ."mysqladmin --user=\"$adminUser\" -p $mechanism create \"$dbName\"
"; - - - $stmt .= $prefix ."mysql --user=\"$adminUser\" -p $mechanism \"$dbName\" < \"$targetfile\"\n"; - $info['display']=$stmt; - - - $stmt = $prefix ."mysqladmin --user=\"$adminUser\" --force --password=\"$adminPwd\" $mechanism drop \"$dbName\"\n"; - $stmt .= $prefix ."mysqladmin --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism create \"$dbName\"\n"; - - $stmt .= $prefix ."mysql --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism \"$dbName\" < \"$targetfile\""; - $info['cmd']=$stmt; - return $info; -} - -function title($title) -{ - if (!isset($_SESSION['setup_user'])) - { - print ""; - } - print "

$title

"; -} - -function resolveTempDir() -{ - - if (OS_UNIX) - { - $dir='/tmp/kt-db-backup'; - } - else - { - $dir='c:/kt-db-backup'; - } - $oKTConfig =& KTConfig::getSingleton(); - $dir = $oKTConfig->get('backup/backupDirectory',$dir); - - if (!is_dir($dir)) - { - mkdir($dir); - } - return $dir; -} - - -function upgradeConfirm() -{ - title('Confirm Upgrade'); - if (!isset($_SESSION['backupStatus']) || $_SESSION['backupStatus'] === false) - { -?> -
-Please ensure that you have made a backup before continuing with the upgrade process. -

-
- -

-We are about to start the upgrade process. -

- -       -       - - - -Are you sure you want to perform the backup? - -

-Your mysql installation has been resolved. Manually, you would do the following: -

- - -
-cd "" -
- -The mysql backup utility could not be found automatically. Either do a manual backup, or edit the config.ini and update the backup/mysql Directory entry. -

-You can continue to do the backup manually using the following process: -

- - -
- - -
-

- -              - - - - - - - - There don't seem to be any backups to restore from the "" directory. - -

- Select a backup to restore from the list below: -

- - - - -
Filename - File Size - Action - -
- - - -
- - -

-       - - - -

-

-Manually, you would do the following to restore the backup: -

- - -
-cd "" -
- -The mysql backup utility could not be found automatically. Either do a manual restore, or edit the config.ini and update the backup/mysql Directory entry. -

-You can continue to do the restore manually using the following command(s): -

- - - - -
- - -
-

- -Press continue to restore to attempt the command(s) above. - -

- - -       -       - - - -       - - - - The backup file "" has been created. -

It appears as though the backup has been successful. -

- - Manually, you would do the following to restore the backup: -

- - - - - - background="../resources/graphics/ktbg.png">  - -
- cd -
- - The mysql backup utility could not be found automatically. Please edit the config.ini and update the backup/mysql Directory entry. -

- If you need to restore from this backup, you should be able to use the following statements: -

- - -
- - -
- - -It appears as though the backup process has failed.

Unfortunately, it is difficult to diagnose these problems automatically -and would recommend that you try to do the backup process manually. -

-We appologise for the inconvenience. -

- - -
- -
- -
- -       - -       - - - The restore of "" has been completed. -

- It appears as though the restore has been successful. -

- - - - -It appears as though the restore process has failed.

-Unfortunately, it is difficult to diagnose these problems automatically -and would recommend that you try to do the backup process manually. -

-We appologise for the inconvenience. -

- - -
- -
- - -
- -       - - - - - The backup is now underway. Please wait till it completes. - 0) - { - $_SESSION['backupStatus'] = true; - - } - else - { - $_SESSION['backupStatus'] = false; - } -?> - - -

- The mysqldump utility was not found in the subdirectory. - -       - - The restore is now underway. Please wait till it completes. - - - -

- The mysql utility was not found in the subdirectory. - -       - -
-Welcome to the Database Upgrade Wizard.

If you have just updated -your code base, you will need to complete the upgrade process in order to ensure your system is fully operational with the new version. -

-You will not be able to log into until your the database upgrade process is completed. -

-!!NB!! You are advised to backup the database before attempting the upgrade. !!NB!! -

-If you have already done this, you may skip this step can continue directly to the upgrade. -

- - -       -       -       -       - - - -

The table below describes the upgrades that need to occur to - upgrade your installation to systemVersion;?>. - Click on the button below the table to perform the upgrades.

- -
- -       -       - -

The table below describes the upgrades that have occurred to - upgrade your installation to systemVersion;?>. - - -Pre-Upgrade actions failed.
- -

-Pre-Upgrade actions succeeded.
- -

- -Upgrade failed. - -

-Upgrade succeeded. - -

- -Post-Upgrade actions failed.

- -

-Post-Upgrade actions succeeded.

- - - -       -       - -

get('ui/poweredByDisabled') == '0'){ - ?> align="right">
+header("Location: upgrade/"); +exit(); \ No newline at end of file diff --git a/setup/wizard/lib/services/unixOpenOffice.php b/setup/wizard/lib/services/unixOpenOffice.php index 5ca89cb..83004be 100644 --- a/setup/wizard/lib/services/unixOpenOffice.php +++ b/setup/wizard/lib/services/unixOpenOffice.php @@ -112,37 +112,68 @@ class unixOpenOffice extends unixService { public function status($updrade = false) { sleep(1); - if($updrade) { - $cmd = "ps ax | grep soffice"; - } else { - $cmd = "netstat -npa | grep ".$this->getPort(); - } - $response = $this->util->pexec($cmd); + $cmd = "ps ax | grep soffice"; + $response = $this->util->pexec($cmd); if(is_array($response['out'])) { - if(count($response['out']) > 0) { - preg_match('/8100/', $response['out'][0], $matches); // Ignore grep - if($matches) { - if($matches[0] == '8100') { + if(count($response['out']) > 1) { + foreach ($response['out'] as $r) { + preg_match('/grep/', $r, $matches); // Ignore grep + if(!$matches) { return 'STARTED'; } - } + } } else { return ''; } } - + /* + if($updrade) { + $cmd = "ps ax | grep soffice"; + $response = $this->util->pexec($cmd); + if(is_array($response['out'])) { + if(count($response['out']) > 1) { + foreach ($response['out'] as $r) { + preg_match('/grep/', $r, $matches); // Ignore grep + if(!$matches) { + return 'STARTED'; + } + } + } else { + return ''; + } + } + } else { + $cmd = "netstat -npa | grep ".$this->getPort(); + $response = $this->util->pexec($cmd); + if(is_array($response['out'])) { + if(count($response['out']) > 0) { + preg_match('/8100/', $response['out'][0], $matches); // Ignore grep + if($matches) { + if($matches[0] == '8100') { + return 'STARTED'; + } + } + } else { + return ''; + } + } + } + */ return ''; } public function start() { $state = $this->status(); if($state != 'STARTED') { - $cmd = "nohup {$this->getBin()} ".$this->getOption()." > ".$this->outputDir."openoffice.log 2>&1 & echo $!"; + //$cmd = "nohup {$this->getBin()} ".$this->getOption()." > ".$this->outputDir."openoffice.log 2>&1 & echo $!"; +// $cmd = "{$this->getBin()} ".$this->getOption(); +//"/usr/bin/java" openOffice -cp "/var/www/installers/knowledgetree/setup/wizard/lib/system/;" /usr/bin/soffice +//"/usr/bin/java" -cp "/var/www/installers/knowledgetree/setup/wizard/lib/system/;" openOffice /usr/bin/soffice + $cmd = "\"{$this->util->getJava()}\" -cp \"".SYS_DIR."\" openOffice ".$this->getBin(); if(DEBUG) { echo "Command : $cmd
"; return ; } - $cmd .= "\"{$this->util->getJava()}\" -cp \"".SYS_DIR.";\" openOffice \""; $response = $this->util->pexec($cmd); return $response; diff --git a/setup/wizard/lib/system/openOffice.class b/setup/wizard/lib/system/openOffice.class index 91be5be..481786f 100644 Binary files a/setup/wizard/lib/system/openOffice.class and b/setup/wizard/lib/system/openOffice.class differ diff --git a/setup/wizard/lib/system/openOffice.java b/setup/wizard/lib/system/openOffice.java index a909a1f..bcc3728 100644 --- a/setup/wizard/lib/system/openOffice.java +++ b/setup/wizard/lib/system/openOffice.java @@ -5,12 +5,13 @@ import java.util.Properties; public class openOffice { public static void main(String args[]) throws Exception { + String openoffice = args[0]; try { // Execute a command without arguments - String command = "nohup /usr/bin/soffice -nofirststartwizard -nologo -headless -accept=\"socket,host=localhost,port=8100;urp;StarOffice.ServiceManager\" > /dev/null 2>&1 & echo $!"; + String command = "nohup "+openoffice+" -nofirststartwizard -nologo -headless -accept=\"socket,host=localhost,port=8100;urp;StarOffice.ServiceManager\""; Process child = Runtime.getRuntime().exec(command); } catch (IOException e) { System.err.println("Error: " + e.getMessage()); } } -} \ No newline at end of file +} diff --git a/setup/wizard/resources/js/wizard.js b/setup/wizard/resources/js/wizard.js index 68ed23a..bdd493d 100644 --- a/setup/wizard/resources/js/wizard.js +++ b/setup/wizard/resources/js/wizard.js @@ -219,10 +219,16 @@ wizard.prototype.sendRegistration = function () { wizard.prototype.clearSessions = function () { var address = 'session.php?action=destroyInstall'; + w.clearASession(address); + var address = 'session.php?action=destroyMigrate'; + w.clearASession(address); +} + +wizard.prototype.clearASession = function (address) { $.ajax({ url: address, dataType: "html", type: "POST", cache: false, - }); + }); } \ No newline at end of file diff --git a/setup/wizard/steps/complete.php b/setup/wizard/steps/complete.php index 2df52e4..ea996df 100644 --- a/setup/wizard/steps/complete.php +++ b/setup/wizard/steps/complete.php @@ -84,6 +84,7 @@ class complete extends Step { // check services $this->checkServices(); $this->storeSilent();// Set silent mode variables + } private function checkFileSystem() @@ -172,7 +173,8 @@ class complete extends Step { } // make db connection - user - $loaded = $this->_dbhandler->load($dbconf['dhost'], $dbconf['dmsusername'], $dbconf['dmsuserpassword'], $dbconf['dname']); + $this->_dbhandler->load($dbconf['dhost'], $dbconf['dmsusername'], $dbconf['dmsuserpassword'], $dbconf['dname']); + $loaded = $this->_dbhandler->getDatabaseLink(); // if we can log in to the database, check access // TODO check write access? if ($loaded) @@ -242,6 +244,11 @@ class complete extends Step { $this->temp_variables['paths_check'] = $this->paths_check; $this->temp_variables['privileges_check'] = $this->privileges_check; $this->temp_variables['database_check'] = $this->database_check; + if (file_exists('migrate.lock')) { + $this->temp_variables['migrate_check'] = true; + } else { + $this->temp_variables['migrate_check'] = false; + } } } ?> \ No newline at end of file diff --git a/setup/wizard/steps/database.php b/setup/wizard/steps/database.php index 2555ea6..ef5758a 100644 --- a/setup/wizard/steps/database.php +++ b/setup/wizard/steps/database.php @@ -636,6 +636,10 @@ class database extends Step } + if(!$this->importExportedDB()) { + $this->error['con'] = "Could not Import "; + } + return true; } @@ -805,6 +809,20 @@ class database extends Step return $this->parse_mysql_dump(SQL_INSTALL_DIR."data.sql"); } + private function importExportedDB() { + if (!WINDOWS_OS) { + $dir='/tmp/kt-db-backup'; + } + else { + $dir='c:/kt-db-backup'; + } + $sqlFile = $dir."/dms_migrate.sql"; + $this->parse_mysql_dump($sqlFile); + $this->_dbhandler->load($this->dhost, $this->duname, $this->dpassword, $this->dname); +// $this->_dbhandler->query("TRUNCATE plugins;"); + $this->_dbhandler->query("TRUNCATE plugin_helper;"); + return true; + } /** * Close connection if it exists * diff --git a/setup/wizard/steps/install.php b/setup/wizard/steps/install.php index bbe598f..7313cdb 100644 --- a/setup/wizard/steps/install.php +++ b/setup/wizard/steps/install.php @@ -91,7 +91,7 @@ class install extends step public function doRun() { - if(isset($_POST['Install'])){ + if(isset($_POST['Install'])) { if(isset($_POST['call_home'])){ $value = $_POST['call_home']; }else{ diff --git a/setup/wizard/templates/complete.tpl b/setup/wizard/templates/complete.tpl index 990c351..aa63d2a 100644 --- a/setup/wizard/templates/complete.tpl +++ b/setup/wizard/templates/complete.tpl @@ -117,7 +117,12 @@ - Goto Login + + + Goto Login + + Goto Login + -- libgit2 0.21.4