Trac - 將 Wiki 轉到不同的 Project

此篇文章最近更新時間為2011-04-18 01:56:16 目前共有0篇留言

關於作者 - JosephJ

任職於 Faria。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

繼上次將 Trac 升級、GitPlugin 終於架設成功,上個禮拜又手癢將 2 個 Project 合成為一個。 對於這種能夠讓團隊工作更順暢的工具、減少不必要的手工的事情,我還蠻喜歡主動抓來做的 :D

為什麼要合併呢?因最初我們在架設 Trac 的時候, 還不是很瞭解 Trac 在 Multiple Projects 上有著嚴重的缺點(跨專案的資源無法共享)。 因此開了高達 5 個不同的 Proejcts,而一年過去,我們實際上有用到的只有 2 個:一個主要用來撰寫 Wiki 、一個主要用來開 Bug/Ticket

需求 1、讓 TracQuery 可以使用

第一個大問題就是:每次當我們開週會、要檢討 Bug/Ticket 進度時都不太方便。因為 Wiki 這個 Project 不能直接用 TracQuery 去查詢到 Bug/Ticket 的 Project。

TracQuery 是啥

有用過 Trac 的朋友就知道這個功能有多好用。甚至像我們的外包團隊還將此功能放到 Release Notes 中,告訴觀看者有哪些功能或 Bug 在此版本中被處理掉了。

需求 2、改掉所有錯誤路徑

前幾天很發現我們一直在使用的 *.dlink.com 不能夠存取了... 原來是同事已經設定好 *.miiicasa.com 後、就把 *.dlink.com 的 DNS Record 給下架了。這樣一來造成的問題就是:很多人之前在 Trac 中寫的都是絕對路徑、現在就會無法存取啦。所以我合併 Multiple Projects 的另一個重點就是做字串取代,將舊網域給更新!

Trac 移轉的策略

幸運的是,寫 Wiki 的那個 Project 並沒有重要的 Ticket 需要保留,所以我的策略很快就決定了:「將 Wiki Project 上的 Wikis 全部轉移到 Bug Ticket Project 上、以後只使用 Bug/Ticket 的 Project。

調查了一下,Trac 有兩個好用的 Command-Line (TracAdmin) 指令可以協助 Wiki 的匯入匯出:trac-admin wiki dump 可以將 Project 的所有 Wiki 匯出成檔案、而 trac-admin wiki load 則可以將 Wiki 檔案匯回到 Project 中。只要寫一支簡單的 PHP Script 即可解決問題。

字串取代先前也有經驗了,PEAR 上有個叫 File_SearchReplace 的好用工具,在 Trac 的機器上將它裝起來,以便後續使用。

$ pear install File_SearchReplace

執行點當然就是在 trac-admin wiki dump 出來成為一個個檔案時動手!

實際的程式

程式我放在 https://gist.github.com/924791,就不一行行地贅述了。如果你 File_SearchReplace 裝好了,只要依據你自己的需求修改 Constants 即可使用:

#!/usr/bin/php
<?php
// Modify the following constants according to your needs.
define("BACKUP_PATH",    "/var/backup/trac/");      // Backup directory.
define("SOURCE_PROJECT", "/var/www/trac/muchiii");  // Source Trac Environment
define("TARGET_PROJECT", "/var/www/trac/router");   // Target Trac Environment
define("REPLACE_FROM", array( // Replace search string in wiki content.
    "muchiii.com",
));
define("REPLACE_TO", array( // Replaced string in wiki content.
    "miiicasa.com",
));
define("WORK_PATH", "/tmp/trac-wiki-transfer/"); // Working directory, 
                                                 // your files will be copied here for string replacement.
$timestamp = date("YmdHi");

// Step 1. Backup.
echo "\n";
exec("mkdir -p ". BACKUP_PATH);
$backup_path = BACKUP_PATH . "muchiii_" . $timestamp . "/";
$cmd = "trac-admin " . SOURCE_PROJECT . " hotcopy $backup_path";
echo "\n";
echo "Backup source project files to $backup_path ... ";
exec($cmd);
echo "(DONE)";
$backup_path = BACKUP_PATH . "router_" . $timestamp . "/";
$cmd = "trac-admin " . TARGET_PROJECT . " hotcopy $backup_path";
echo "\n";
echo "Backup target project files to $backup_path ... ";
exec($cmd);
echo "(DONE)";

// Step 2. Create working directory.
echo "\n";
$work_path = WORK_PATH . $timestamp;
echo "Create working directory $work_path ... ";
exec("mkdir -p $work_path");
echo "(DONE)";

// Step 3. Dumping source wiki files.
echo "\n";
$cmd = "trac-admin " . SOURCE_PROJECT . " wiki dump $work_path";
echo "Dumping source wiki files to $work_path ... ";
exec($cmd);
echo "(DONE)";

// Step 4. String replacement.
echo "\n";
require_once "/usr/share/pear/File/SearchReplace.php"; // Batchly find and replace file content.
$from = array(
    "muchiiilla.dlink.com.tw",
    "muchiii.com",
    "devm1-muchiii.dlink.com.tw",
    "git-muchiii.dlink.com.tw",
    "trac-muchiii.dlink.com.tw",
);
$to = array(
    "muchiiilla.corp.miiicasa.com",
    "miiicasa.com",
    "devm1.corp.miiicasa.com",
    "git.corp.miiicasa.com",
    "muchiiilla.corp.miiicasa.com",
);
echo "Making necessary string replacement ... ";
$work_path = $work_path . "/";
$snr = new File_SearchReplace($from, $to, array(), $work_path, TRUE);
$snr->setSearchFunction("normal");
$snr->doSearch();
echo "(DONE)";

// Step 5. Copy attachment files to destination. (protect existing files.)
echo "\n";
$cmd = "cp -R --update " . SOURCE_PROJECT . "/attachments " . TARGET_PROJECT . "/";
echo "Coping attachment files to target project " . TARGET_PROJECT . "/attachments  ... ";
exec($cmd);
echo "(DONE)";

// Step 6. Target loads wiki files in working directory. (project existing wikis)
echo "\n";
$cmd = "trac-admin " . TARGET_PROJECT . " wiki load $work_path";
echo "Inserting wiki files to project " . TARGET_PROJECT . " ... ";
exec($cmd);
echo "(DONE)";

// Step 7. Target loads wiki files in working directory. (project existing wikis)
echo "\n";
$cmd = "rm -rf $work_path";
echo "Removing working directory ($work_path) ... ";
exec($cmd);
echo "(DONE)";

echo "\n\n";
?>

執行轉移

含研究、寫 PHP Script、裝套件、執行共花了三個多小時,執行的成果還蠻令人滿意的,成功的做好了字串取代與 Wiki 轉移,原有的 Trac 也下架了,但作為一個 F2E、一定要考慮 Compatibility 的問題!之前的舊網址仍舊有效,不要讓大家感受到改版之後的 Suffering。

以後就可以用 TicketQuery 來寫 Weekly 啦,真的一目瞭然許多:

Snap5


暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
驗證碼:
送出

Facebook Comment