SVN用戶使用指南1.0_第1頁
SVN用戶使用指南1.0_第2頁
SVN用戶使用指南1.0_第3頁
SVN用戶使用指南1.0_第4頁
SVN用戶使用指南1.0_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、SVN用戶使用指南Version 1.0文檔變更記錄文件狀態(tài): 草稿 正式發(fā)布 當前版本:V1.0作 者:wanghj審 核 人:發(fā)布日期:修訂號修改內(nèi)容描述修改人修改日期備注目 錄 TOC o 1-3 h z u HYPERLINK l _Toc237319714 1. 引言 PAGEREF _Toc237319714 h 1 HYPERLINK l _Toc237319715 1.1. 目的 PAGEREF _Toc237319715 h 1 HYPERLINK l _Toc237319716 1.2. 范圍 PAGEREF _Toc237319716 h 1 HYPERLINK l _T

2、oc237319717 2. SVN根底知識 PAGEREF _Toc237319717 h 1 HYPERLINK l _Toc237319718 2.1. SVN簡介 PAGEREF _Toc237319718 h 1 HYPERLINK l _Toc237319719 2.2. SVN特性 PAGEREF _Toc237319719 h 1 HYPERLINK l _Toc237319720 2.3. SVN的架構(gòu) PAGEREF _Toc237319720 h 3 HYPERLINK l _Toc237319721 3. SVN的根本應(yīng)用 PAGEREF _Toc237319721 h

3、 4 HYPERLINK l _Toc237319722 3.1. 客戶端的安裝 PAGEREF _Toc237319722 h 4 HYPERLINK l _Toc237319723 3.2. 版本庫瀏覽 Repo-browser PAGEREF _Toc237319723 h 6 HYPERLINK l _Toc237319724 3.3. 版本庫的根本操作 PAGEREF _Toc237319724 h 8 HYPERLINK l _Toc237319725 3.3.1. Add filefolder添加文件(文件夾) PAGEREF _Toc237319725 h 8 HYPERLIN

4、K l _Toc237319726 3.3.2. commit 提交 PAGEREF _Toc237319726 h 9 HYPERLINK l _Toc237319727 3.3.3. Show log 查看日志 PAGEREF _Toc237319727 h 9 HYPERLINK l _Toc237319728 3.3.4. Export 導出 PAGEREF _Toc237319728 h 11 HYPERLINK l _Toc237319729 3.3.5. Revision graph 版本樹顯示 PAGEREF _Toc237319729 h 12 HYPERLINK l _To

5、c237319730 3.3.6. Check out 檢出 PAGEREF _Toc237319730 h 13 HYPERLINK l _Toc237319731 3.3.7. Refresh 刷新 PAGEREF _Toc237319731 h 13 HYPERLINK l _Toc237319732 3.3.8. Delete 刪除 PAGEREF _Toc237319732 h 14 HYPERLINK l _Toc237319733 3.3.9. Rename 對目錄或文件進行改名 PAGEREF _Toc237319733 h 14 HYPERLINK l _Toc2373197

6、34 3.3.10. Copy to working copy 把當前目錄拷貝到本地 PAGEREF _Toc237319734 h 15 HYPERLINK l _Toc237319735 3.3.11. Copy to 拷貝到 PAGEREF _Toc237319735 h 16 HYPERLINK l _Toc237319736 3.4. 客戶端操作 PAGEREF _Toc237319736 h 17 HYPERLINK l _Toc237319737 3.4.1. 客戶端的根本操作 PAGEREF _Toc237319737 h 17 HYPERLINK l _Toc23731973

7、8 3.4.2. 常用功能介紹 PAGEREF _Toc237319738 h 20 HYPERLINK l _Toc237319739 3.4.3. 分支與合并 PAGEREF _Toc237319739 h 23 HYPERLINK l _Toc237319740 4. SVN API PAGEREF _Toc237319740 h 25 HYPERLINK l _Toc237319741 4.1. 使用API PAGEREF _Toc237319741 h 25 HYPERLINK l _Toc237319742 4.2. URL和路徑需求 PAGEREF _Toc237319742 h

8、 27 HYPERLINK l _Toc237319743 4.3. 使用C和C+以外的語言 PAGEREF _Toc237319743 h 27 HYPERLINK l _Toc237319744 4.4. 代碼樣例 PAGEREF _Toc237319744 h 28 HYPERLINK l _Toc237319745 4.4.1. 使用版本庫層 PAGEREF _Toc237319745 h 28 HYPERLINK l _Toc237319746 4.4.2. 使用Python處理版本庫層 PAGEREF _Toc237319746 h 35 HYPERLINK l _Toc23731

9、9747 4.4.3. 一個Python狀態(tài)爬蟲 PAGEREF _Toc237319747 h 40 HYPERLINK l _Toc237319748 4.5. 參考資料 PAGEREF _Toc237319748 h 45引言目的為了對配置管理工具(Subversion,以下簡稱為SVN)應(yīng)用過程提供指導,編制此指南.范圍本標準適應(yīng)于北京高偉達軟件技術(shù)內(nèi)部使用SVN根底知識SVN簡介SVN 是一具開源的版本控制系統(tǒng),SVN 將文件存放在中心版本庫里,這個版本庫很像一個普通的文件效勞器,不同的是,它可以記錄每一次文件和的修改情況。這樣我們就可以籍此將數(shù)據(jù)回復到以前的版本,并可以查看的更改細

10、節(jié)。也就是說,一旦一個文件被傳到SVN 上面,那么不管對它進行什么操作,SVN 都會有清晰的記錄,即使它在N 天前被刪除了,也可以被找回來。所以,許多人將版本控制系統(tǒng)當作一種神奇的“時間機器。SVN特性版本化目錄SVN 實現(xiàn)的“虛擬版本化文件系統(tǒng)可以跟蹤目錄樹的變更。也就是說,在SVN 中,文件和目錄都是版本化的。真實的版本歷史由于實現(xiàn)了文件和目錄的版本化,SVN 可以記錄如文件拷貝和改名這些常見操作帶來的版本變更,即在SVN 中,對文件或目錄都可以進行增加、拷貝和操作,并有版本歷史記錄。原子提交一系列相關(guān)的更改,要么全部提交到版本庫,要么一個也不提交,這樣用戶就可以將相關(guān)的更改組成一個邏輯整

11、體,防止出現(xiàn)局部修改需另一局部未修改的情況提交到版本庫中。可選的網(wǎng)絡(luò)層SVN 在版本庫訪問的實現(xiàn)上具有較高的抽象程度,利于人們實現(xiàn)新的網(wǎng)絡(luò)訪問機制。SVN 可以作為一個擴展模塊嵌入到Apache 之中,這種方式在穩(wěn)定性和交互性方面有很大的優(yōu)勢,可以直接使用效勞器的成熟技術(shù)認證、授權(quán)和傳輸壓縮等。此外,SVN 自身也實現(xiàn)了一個輕型的、可獨立運行的效勞器軟件。這個效勞器使用了一個特定的協(xié)議,這個協(xié)議可以輕松用SSH 封裝。我們目前選用的是SVN 自身的效勞器,即Svnserver 方式,本文主要是對Svnserver 方式的使用方法介紹。一致的數(shù)據(jù)操作SVN 用一個二進制差算法描述文件和變化,對于

12、文件可讀和二進行制不可讀文件其操作方式是一致的。這兩種類型的文件壓縮存儲在版本庫中,而差異信息那么在網(wǎng)絡(luò)上雙向傳遞。高效的分支和標簽操作在 SVN 中,分支與標簽操作的開銷與工程的大小無關(guān),SVN 的分支和標簽操作是一種類似于硬鏈接的機制拷貝整個工程。因而這些操作通常只會花費很少且相對固定的時間??尚薷男許VN 沒有歷史負擔,它以一系列優(yōu)質(zhì)的共享C 程序庫的方式實現(xiàn),具有定義良好的API。SVN的架構(gòu)SVN的根本應(yīng)用客戶端的安裝點擊Yes,重啟電腦,完成安裝。版本庫瀏覽 Repo-browser完成安裝之后,點擊鼠標右鍵,會出現(xiàn)以下圖,這是SVN的根本功能,下面一一介紹.點擊Repo-brow

13、ser之后,會出現(xiàn)下面的小對話框:在里面輸入你要鍵接的版本庫:輸入方法為: s:/效勞器IP:端口號/所在版本庫名稱,如PQA的配置庫為: s:/.8:8443/PQA記得svn 是小寫字母的,點“OK進入登錄界面。如果以前有登錄過,SVN 會自動記錄登錄歷史。登錄界面如下:輸入用戶名和密碼即可進入所在的版本庫。版本庫的根本操作Add filefolder添加文件(文件夾)用此命令可以向效勞器端目錄添加一個本地的文件或文件夾。commit 提交使用commit命令可以將add的文件添加到效勞器Show log 查看日志點擊此按扭,會顯示當前目錄下的所有文件和目錄日志的信息。會跳出下面的對話框:

14、Export 導出用此命令,指定路徑,便可導出一個干凈的目錄樹,所謂“干凈的就是導出的文件不受SVN 的版本控制。默認的是導出當前版本的目錄內(nèi)容,當然也可以指定你想導出的版,如以下圖:在Export directory中選擇本地的路徑.Revision graph 版本樹顯示 它可以把對此目錄所做的所有操作以圖的形式顯示出來,并可以記錄每一步都進行了什么操作,相當于“Show log的一個圖解,如以下圖所示:Check out 檢出用此命令可以從效勞器導出選中的目錄到本地工作拷貝本機,它和Export 的區(qū)別在于,檢出的文件受版本控制,如以下圖所示:Refresh 刷新刷新效勞器端目錄。Del

15、ete 刪除對目錄或文件都可以進行刪除操作,刪除后版本號增加,可以通過“show log找出已經(jīng)刪除的文件,并且可以看到文件夾變成:注意:文件只有在自己的工作副本中刪除了,必須執(zhí)行commit,文件才算是真正的刪除了。Rename 對目錄或文件進行改名如果要對文件進行改名,要在效勞器端對文件或文件夾用Rename 命令,改完后在本地工作拷貝的上級目錄執(zhí)行“Commit即可??梢栽诒镜赜糜益I,使用TSVN 的菜單改名,提交后效果一樣。Copy to working copy 把當前目錄拷貝到本地本地工作拷貝必須是已經(jīng)受版本控制的文件夾,執(zhí)行此命令后,如:把“01 參考資料復制到本地工作拷貝的“P

16、QA中,就會出現(xiàn)以下圖,綠色的對號表示此目錄是從效勞器上“Checkout出來的受版本控制的本地工作拷貝,藍色的加號表示此文件預添加到效勞器上。這時,在此目錄空白處或選中“01參考資料文件夾,右鍵執(zhí)行“SVN Commit命令如以下圖所示:“01參考資料便會成功提交到效勞器上“PQA的目錄下面。Copy to 拷貝到用此命令可以在當前版本庫中建立分支標簽/基線,SVN 允許并行的維護文件和目錄的分支,各個分支間互相聯(lián)系,也可以從一個分支復制修改到另一個分支,最終,可以讓本地工作拷貝反映到不同的分支上,所以在日常的工作中,可以“混合和比較不同的開發(fā)線??蛻舳瞬僮骺蛻舳说母静僮髟诒镜毓ぷ骺截惪瞻?/p>

17、處點擊右鍵會出現(xiàn)如以下圖所示,下面對此菜單中常用的功能做詳細的介紹.工作拷貝就是執(zhí)行“checkout命令從效勞器端檢出到本地的一個目錄,是個人的一個私有工作區(qū),在此目錄下,可以任意的編輯文件,如果是源代碼文件,可以像平常一樣編譯。比方,我們對過程記錄中會議記錄中一個文件的日期做修改,被編輯后的文件和它的上一級目錄都會顯示為:這時可以對此文件執(zhí)行 SVN Commit 提交操作,那么編輯的內(nèi)容便會提交到效勞器上,以便大家共享你的工作成果。這時對改后的版本點擊右鍵,執(zhí)行“Show log后,可以顯示版本日志,如果想看到本次的改動和原始的版本有何差異,那么選中當前版本記錄,右鍵執(zhí)行“show ch

18、anges如以下圖所示:這時它就會顯示本次是哪些動作導致了版本的變化,紅色局部新增加的內(nèi)容,它以標注的方式顯示:還要補充說明的是,在SVN 上,有三種權(quán)限:讀、讀寫、無權(quán)限。如果想對你的工作拷貝進行編輯,那么你必須有在這個目錄下讀寫的權(quán)限,如果在效勞器端此目錄下面你無權(quán)限或只有讀的權(quán)限,那么即使在本地拷貝做了修改,也不能提交到效勞器上,也就是說,每個有讀權(quán)限的人可以看查版本庫目錄下的內(nèi)容無權(quán)限的不能查看,但只能對自己被賦予讀寫權(quán)限的目錄做修改。這就保護了你的工作目錄不會被別的人隨意改動。常用功能介紹Revert 返回上一級如果你對文件做了修改之后,還未進行提交,可是文檔的標記已經(jīng)為紅色的嘆號,

19、而這時你又發(fā)現(xiàn)變錯了,想把文檔返回到原來的狀態(tài),這時你可以執(zhí)行Revert 操作,便可使文檔回到原來的狀態(tài),因為你沒有執(zhí)行提交操作,這時效勞器上版本庫版本號不會增加。Update to revision 返回到版本如果是你已經(jīng)執(zhí)行了提交操作,這時可以用Update to revision 命令,在跳出的對話框中選擇你想返回到的版本,那么你的本地工作拷貝便會回到你所選的版本的狀態(tài)?!癝ave revision to也可以把原來版本進行存檔。強調(diào)一點的是,你的本地工作拷貝可以返回到原來的版本,可是效勞器上只會記錄你對它進行最后一次提交的版本,所以效勞器端版本不會變化,如果你想把效勞器端的文檔內(nèi)容也

20、換為原來的狀態(tài),可以用舊版本文件覆蓋新版本文件,然后提交。Import 導入導入是一種批量向效勞器上添加文件的方法,如果你想把本地的文件或文件夾添加到效勞器上的某個目錄下面,那么在本地的目錄中,在空白處右鍵TortoisrSVNImport,會跳出下面的對話框:點“OK后就可以把本地的文件或文件夾導入到效勞器端所選目錄下面。SVN Update 更新用此命令可以更新你的工作拷貝,因為每個人都有自己的工作拷貝,在你對工程目錄進行操作的同時,工程組其他人員也在進行編輯并提交的動作,版本庫內(nèi)容隨著工程人員的每一次提交做著不同的變化,所以在每次編輯操作之前,都要對本地工作拷貝執(zhí)行Update 的操作,

21、以保證本地工作拷貝與效勞器工程版本庫內(nèi)容保持一致。Resolved 沖突已解決當兩個人同時編輯一個文件,一個人先提交后,另一個人再進行提交的時候就會出現(xiàn)沖突,這時會彈出沖突對話框,如以下圖所示:你可以對出現(xiàn)的沖突的文件進行編輯,選定你最終想要的文檔。這就是“Merge合并操作。在出現(xiàn)沖突以及應(yīng)用分支時會經(jīng)常用到合并的功能。合并完畢后,執(zhí)行 Resolved,那么新的版本就被生成了。Switch 切換把你的工作拷貝切換到另個的URL效勞器目錄,效勞器端目錄有所變化,所存儲的文件位置發(fā)生了變化,那么對你的工作拷貝進行編輯后就會出現(xiàn)提交不上去的情況,這時就要執(zhí)行Switch 操作,使你的工作拷貝切換

22、到效勞器端對應(yīng)的目錄下面,即可再進行提交。Switch 操作只限于版本庫內(nèi)的切換。Relocate 重新定位它和Switch 的功能是一樣的,不同的是,它實現(xiàn)的是版本庫與版本庫之間的切換。當效勞器地址或版本庫名稱發(fā)生變化時,可以用些命令來更新你的工作拷貝。CreateApply patch 創(chuàng)立應(yīng)用補丁如果你對這個文件沒有修改的權(quán)限,但是迫于形勢,你又必須對這個文件進行修改,這時你就可以用Create patch 創(chuàng)立補丁,然后把你創(chuàng)立的補丁發(fā)給對此目錄有寫權(quán)限的工作人員,他執(zhí)行Apply patch后,你所做的修改就會被提交到效勞器上。分支與合并從工程主分支下載工程初始源碼到開發(fā)分支操作步驟

23、:在trunk目錄新建一個工程名稱為Astx;在Astx工程中新建兩個模塊分別為module1和module2,分別為新建一個名 test.txt的文件;選擇Astx工程名稱,右擊選擇branch/tag;請注意 From WC at URL必須是工程Astx的根路徑,To URL:在這里選擇branch 存放的路徑,通常的路徑為: :/localhost/svn/Astx/branches/astx_dev_tb; 注:Branches為分支的存放路徑,astx_dev_tb為分支的名稱在branches 目錄右擊update,就可以看到剛剛的astx_dev_tb分支;把分支(astx_d

24、ev_tb)的的修改合并到工程主分支操作步驟:選擇工程主分支右擊TortoiseSVN選擇 merge,選擇 Reintegrate a branch;點擊Next,在URL to merge from 的地址欄中選擇astx_dev_tb分支的路徑; 注意Working copy是工程主分支的路徑;點擊NEXT,在Merge depth 下拉框中選擇 “working copy,點擊Merge, 將分支的修改合并到主干上;在工程主分支右擊commit,整個的過程才算完成!如果要退回前一個版本,選擇工程主分支右擊TortoiseSVN選擇Revert,將取消本 次合并的內(nèi)容.兩個不同分支的修改

25、合并到工程主分支修改同一個文件的不同行操作步驟:基于工程主分支創(chuàng)立兩個不同的分支分別為:astx_dev_john,astx_dev_harry(創(chuàng)立分支的方法,請參照1.1);注: john和harry 為同一個工程創(chuàng)立自己的工作副本,工作是并行的.john和harry修改同一個文件text.txt的不同行,john先保存修改到版本庫(具體 的合并的步驟,請參照1.2),最后別忘了commit!當harry提交修改的時候,版本庫提示文件text.txt在他上次更新之后已經(jīng)更改了, 如果john修改的內(nèi)容不和harry的沖突,一旦把所有的修改集成到一起,就可以把工作拷貝保存到版本庫,最后別忘了

26、commit! 修改同一個文件的同一行操作步驟:基于工程主分支創(chuàng)立兩個不同的分支分別為:astx_dev_john,astx_dev_harry;注: john和harry 為同一個工程創(chuàng)立自己的工作副本,工作是并行的.john和harry修改同一個文件text.txt的同一行,john先保存修改到版本庫(具體的合并的步驟,請參照1.2);當harry提交修改的時候,版本庫提示文件text.txt沖突,這時只能夠人工去選擇一組修改,并把所有的修改集成到一起,就可以把工作拷貝保存到版本庫,記得做完之后一定要commit!SVN API使用API使用Subversion庫API開發(fā)應(yīng)用看起來相當?shù)?/p>

27、直接,所有的公共頭文件放在源文件的subversion/include目錄,從源代碼編譯和安裝Subversion本身,需要這些頭文件拷貝到系統(tǒng)位置。這些頭文件包括了所有用戶和Subversion庫可以訪問的功能和類型。Subversion開發(fā)者社區(qū)仔細確實保所有的公共API有完好的文檔直接引用頭文件的文檔。你首先應(yīng)該注意Subversion的數(shù)據(jù)類型和方法是命名空間保護的,每一個公共Subversion對象名以svn_開頭,然后緊跟一個這個對象定義如wc、client和fs等等所在的庫的簡短編碼,然后是一個下劃線_和后面的對象名稱。半公開的方法庫使用,但是但庫之外代碼不可以使用并且只可以在庫

28、自己的目錄看到與這個命名模式不同,并不是庫代碼之后緊跟一個下劃線,他們是用兩個下劃線_。給定源文件的私有方法沒有特殊前綴,使用static聲明。當然,一個編譯器不會關(guān)心命名習慣,只是用來區(qū)分給定方法或數(shù)據(jù)類型的應(yīng)用范圍。關(guān)于Subversion的API編程的另一個好的資源是hacking指南,可以在找到,這個文檔包含了有用的信息,同時滿足Subversion本身的開發(fā)者和將Subversion作為第三方庫的開發(fā)者。Apache 可移值運行庫伴隨Subversion自己的數(shù)據(jù)類型,你會看到許多apr開頭的數(shù)據(jù)類型引用來自Apache可移植運行庫APR的對象。APR是Apache可移植運行庫,源自

29、為了效勞器代碼的多平臺性,嘗試將不同的操作系統(tǒng)特定字節(jié)與操作系統(tǒng)無關(guān)代碼隔離。結(jié)果就提供了一個根底API的庫,只有一些適度區(qū)別或者是廣泛的來自各個操作系統(tǒng)。Apache 效勞器很明顯是APR庫的第一個用戶,Subversion開發(fā)者立刻發(fā)現(xiàn)了使用APR庫的價值。意味著Subversion沒有操作系統(tǒng)特定的代碼,也意味著Subversion客戶端可以在Server存在的平臺編譯和運行。當前這個列表包括,各種類型的Unix、Win32、OS/2和Mac OS X。除了提供了跨平臺一致的系統(tǒng)調(diào)用, APR給Subversion對多種數(shù)據(jù)類型有快速的訪問,如動態(tài)數(shù)組和哈希表。Subversion在代碼

30、中廣泛使用這些類型,但是Subversion的API原型中最常見的APR類型是apr_pool_tAPR內(nèi)存池,Subversion使用內(nèi)部緩沖池用來進行內(nèi)存分配除非外部庫在API傳遞參數(shù)時需要一個不同的內(nèi)存管理模式,而且一個人如果針對Subversion的API編碼不需要做同樣的事情,他們可以在需要時給API提供緩沖池,這意味著Subversion的API使用者也必須鏈接到APR,必須調(diào)用apr_initialize()來初始化APR子系統(tǒng),而且在使用Subversion API時必須創(chuàng)立和管理池,通常是使用svn_pool_create()、svn_pool_clear()和svn_poo

31、l_destroy()。使用內(nèi)存池編程幾乎每一個使用過C語言的開發(fā)者曾經(jīng)感慨令人畏縮的內(nèi)存管理,分配足夠的內(nèi)存,并且追蹤內(nèi)存的分配,在不需要時釋放內(nèi)存這個任務(wù)會非常復雜。當然,如果沒有正確地做到這一點會導致程序毀掉自己,或者更加嚴重一點,把電腦搞癱。另一方面高級語言使開發(fā)者完全擺脫了內(nèi)存管理, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.html l ftn.d0e13397#ftn.d0e13397 53Java和Python之類的語言使用垃圾收集原理,在需要的時候分配對象內(nèi)存,在不使用時進行清理。APR提供

32、了一種叫做池根底的中等的內(nèi)存管理方法,允許開發(fā)者以一種低分辨率的方式控制內(nèi)存每塊或池“pool的內(nèi)存,而不是每個對象。不是使用malloc()和其他按照對象分配內(nèi)存的方式,你要求APR從內(nèi)存創(chuàng)立一段內(nèi)存池,當你結(jié)束使用在池中創(chuàng)立的對象,你銷毀池,可以有效地取消其中的對象消耗的內(nèi)存。通過池,你不需要跟蹤每個對象的內(nèi)存釋放,你的程序只需要跟蹤這些對象,將對象分配到池中,而池的生命周期池的創(chuàng)立和刪除之間的時間滿足所有對象的需要。URL和路徑需求因為分布式版本控制操作是Subversion存在的重點,有意義來關(guān)注一下國際化i18n支持。畢竟,當“分布式或許意味著“橫跨辦公室,它也意味著“橫跨全球。為了

33、更容易一點,Subversion的所有公共接口只接受路徑參數(shù),這些參數(shù)是傳統(tǒng)的,使用UTF-8編碼。這意味著,舉個例子,任何新的使用libsvn_client接口客戶端庫,在把這些參數(shù)傳遞給Subversion庫前,需要首先將路徑從本地代碼轉(zhuǎn)化為UTF-8代碼,然后將Subversion傳遞回來的路徑轉(zhuǎn)換為本地代碼,很幸運,Subversion提供了一組任何程序可以使用的轉(zhuǎn)化方法見subversion/include/svn_utf.h。同樣,Subversion的API需要所有的URL參數(shù)是正確的URI編碼,所以,我們不會傳遞file:/home/username/My File.txt作為

34、My File.txt的URL,而要傳遞file:/home/username/My%20File.txt。再次,Subversion提供了一些你可以使用的助手方法svn_path_uri_encode()和svn_path_uri_decode(),分別用來URI的編碼和解碼。使用C和C+以外的語言除C語言以外,如果你對使用其他語言結(jié)合Subversion庫感興趣如Python腳本或是Java應(yīng)用Subversion通過簡單包裹生成器SWIG提供了最初的支持。Subversion的SWIG綁定位于subversion/bindings/swig,并且慢慢的走向成熟進入可用狀態(tài)。這個綁定允許你

35、直接調(diào)用Subversion的API方法,使用包裹器會把腳本數(shù)據(jù)類型轉(zhuǎn)化為Subversion需要的C語言庫類型。非常不幸,Subversion的語言綁定缺乏對核心Subversion模塊的關(guān)注,但是,花了很多力氣處理創(chuàng)立針對Python、Perl和Ruby的功能綁定,在一定程度上,在這些接口上的工作量可以在其他語言的SWIG包括C#、Guile、Java、MzScheme、OCaml、PHP、Tcl等等接口上得到重用。然而,為了完成復雜的API,一些SWIG接口仍然需要額外的編程工作,關(guān)于SWIG本身的更多信息可以看工程的網(wǎng)站 :/ /。Subversion也有Java的語言

36、綁定,JavaJL綁定位于Subversion源目錄樹的subversion/bindings/java不是基于SWIG的,而是javah和手寫JNI的混合,JavaHL幾乎覆蓋Subversion客戶端的API,目標是作為Java根底的Subversion客戶端和集成IDE的實現(xiàn)。Subversion的語言綁定缺乏Subversion核心模塊的關(guān)注,但是通??梢宰鳛橐粋€產(chǎn)品信賴。大量腳本、應(yīng)用、Subversion的GUI客戶端和其他第三方工具現(xiàn)在已經(jīng)成功地運用了Subversion語言綁定來完成Subversion的集成。這里使用其它語言的方法來與Subversion交互沒有任何意義:Su

37、bversion開發(fā)社區(qū)沒有提供其他的綁定,你可以在Subversion工程鏈接頁里找到其他綁定的鏈接,但是有一些流行的綁定我覺得應(yīng)該特別留意。首先是Python的流行綁定,Barry Scott的PySVN。PySVN鼓吹它們提供了更多Python樣式的接口,而不像Subversion自己的Python綁定的C樣式接口。對于希望尋求Subversion純Java實現(xiàn)的人,可以看看SVNKit :/svnkit /,也就是從頭使用Java編寫的Subversion。你必須要小心,SVNKit沒有采用Subversion的核心庫,其行為方式?jīng)]有確保與Subversion匹配。代碼樣例使用版本庫層

38、使用版本庫層中包含了一段C代碼C編寫描述了我們討論的概念,它使用了版本庫和文件系統(tǒng)接口可以通過方法名svn_repos_和svn_fs_分辨創(chuàng)立了一個添加目錄的修訂版本。你可以看到APR庫的使用,為了內(nèi)存分配而傳遞,這些代碼也揭開了一些關(guān)于Subversion錯誤處理的晦澀事實所有的Subversion錯誤必須需要明確的處理以防止內(nèi)存泄露在某些情況下,應(yīng)用失敗。/* Convert a Subversion error into a simple boolean error code. * * NOTE: Subversion errors must be cleared (using svn

39、_error_clear() * because they are allocated from the global pool, else memory * leaking occurs. */#define INT_ERR(expr) do svn_error_t *_temperr = (expr); if (_temperr) svn_error_clear(_temperr); return 1; return 0; while (0)/* Create a new directory at the path NEW_DIRECTORY in the Subversion * rep

40、ository located at REPOS_PATH. Perform all memory allocation in * POOL. This function will create a new revision for the addition of * NEW_DIRECTORY. Return zero if the operation completes * successfully, non-zero otherwise. */static intmake_new_directory(const char *repos_path, const char *new_dire

41、ctory, apr_pool_t *pool) svn_error_t *err; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict_str; /* Open the repository located at REPOS_PATH. */ INT_ERR(svn_repos_open(&repos, repos_path, pool); /* Get a pointer to the fil

42、esystem object that is stored in REPOS. */ fs = svn_repos_fs(repos); /* Ask the filesystem to tell us the youngest revision that * currently exists. */ INT_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool); /* Begin a new transaction that is based on YOUNGEST_REV. We are * less likely to have our lat

43、er commit rejected as conflicting if we * always try to make our changes against a copy of the latest snapshot * of the filesystem tree. */ INT_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool); /* Now that we have started a new Subversion transaction, get a root * object that represents that trans

44、action. */ INT_ERR(svn_fs_txn_root(&txn_root, txn, pool); /* Create our new directory under the transaction root, at the path * NEW_DIRECTORY. */ INT_ERR(svn_fs_make_dir(txn_root, new_directory, pool); /* Commit the transaction, creating a new revision of the filesystem * which includes our added di

45、rectory path. */ err = svn_repos_fs_commit_txn(&conflict_str, repos, &youngest_rev, txn, pool); if (! err) /* No error? Excellent! Print a brief report of our success. */ printf(Directory %s was successfully added as new revision %ld.n, new_directory, youngest_rev); else if (err-apr_err = SVN_ERR_FS

46、_CONFLICT) /* Uh-oh. Our commit failed as the result of a conflict * (someone else seems to have made changes to the same area * of the filesystem that we tried to modify). Print an error * message. */ printf(A conflict occurred at path %s while attempting to add directory %s to the repository at %s

47、.n, conflict_str, new_directory, repos_path); else /* Some other error has occurred. Print an error message. */ printf(An error occurred while attempting to add directory %s to the repository at %s.n, new_directory, repos_path); INT_ERR(err); 使用Python處理版本庫層同樣的C程序需要處理APR內(nèi)存池系統(tǒng),但是Python自己處理內(nèi)存,Subversio

48、n的Python綁定也遵循這種習慣。在C語言中,為表示路徑和條目的hash需要處理自定義的數(shù)據(jù)類型例如APR提供的庫,但是Python有hash叫做“dictionaries,并且是內(nèi)置數(shù)據(jù)類型,而且還提供了一系列操作這些類型的函數(shù),所以SWIG通過Subversion的語言綁定層的自定義幫助要小心的將這些自定義數(shù)據(jù)類型映射到目標語言的數(shù)據(jù)類型,這為目標語言的用戶提供了一個更加直觀的接口。#!/usr/bin/pythonCrawl a repository, printing versioned object path names.import sysimport os.pathimport

49、 svn.fs, svn.core, svn.reposdef crawl_filesystem_dir(root, directory): Recursively crawl DIRECTORY under ROOT in the filesystem, and return a list of all the paths at or below DIRECTORY. # Print the name of this path. print directory + / # Get the directory entries for DIRECTORY. entries = svn.fs.sv

50、n_fs_dir_entries(root, directory) # Loop over the entries. names = entries.keys() for name in names: # Calculate the entrys full path. full_path = directory + / + name # If the entry is a directory, recurse. The recursion will return # a list with the entry and all its children, which we will add to

51、 # our running list of paths. if svn.fs.svn_fs_is_dir(root, full_path): crawl_filesystem_dir(root, full_path) else: # Else its a file, so print its path here. print full_pathdef crawl_youngest(repos_path): Open the repository at REPOS_PATH, and recursively crawl its youngest revision. # Open the rep

52、ository at REPOS_PATH, and get a reference to its # versioning filesystem. repos_obj = svn.repos.svn_repos_open(repos_path) fs_obj = svn.repos.svn_repos_fs(repos_obj) # Query the current youngest revision. youngest_rev = svn.fs.svn_fs_youngest_rev(fs_obj) # Open a root object representing the younge

53、st (HEAD) revision. root_obj = svn.fs.svn_fs_revision_root(fs_obj, youngest_rev) # Do the recursive crawl. crawl_filesystem_dir(root_obj, ) if _name_ = _main_: # Check for sane usage. if len(sys.argv) != 2: sys.stderr.write(Usage: %s REPOS_PATHn % (os.path.basename(sys.argv0) sys.exit(1) # Canonical

54、ize the repository path. repos_path = svn.core.svn_path_canonicalize(sys.argv1) # Do the real work. crawl_youngest(repos_path)一個Python狀態(tài)爬蟲Subversion的Python綁定也可以用來進行工作拷貝的操作,在本章前面的小節(jié)中,我們提到過libsvn_client接口,它存在的目的就是簡化編寫Subversion客戶端的難度, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.htm

55、l l svn.developer.usingapi.otherlangs.ex-2 o 例8.3.一個Python狀態(tài)爬蟲 例8.3 “一個Python狀態(tài)爬蟲是一個例子,講的是如何使用SWIG綁定創(chuàng)立一個擴展版本的svn status命令。#!/usr/bin/env pythonCrawl a working copy directory, printing status information.import sysimport os.pathimport getoptimport svn.core, svn.client, svn.wcdef generate_status_code(

56、status): Translate a status value into a single-character status code, using the same logic as the Subversion command-line client. code_map = svn.wc.svn_wc_status_none : , svn.wc.svn_wc_status_normal : , svn.wc.svn_wc_status_added : A, svn.wc.svn_wc_status_missing : !, svn.wc.svn_wc_status_incomplet

57、e : !, svn.wc.svn_wc_status_deleted : D, svn.wc.svn_wc_status_replaced : R, svn.wc.svn_wc_status_modified : M, svn.wc.svn_wc_status_merged : G, svn.wc.svn_wc_status_conflicted : C, svn.wc.svn_wc_status_obstructed : , svn.wc.svn_wc_status_ignored : I, svn.wc.svn_wc_status_external : X, svn.wc.svn_wc_status_unversioned : ?, return code_map.get(status, ?)def do_status(wc_path, verbose): # Calculate the length of the input worki

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論