dyerac  
          dyerac In Java
          公告

          日歷
          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234
          統(tǒng)計(jì)
          • 隨筆 - 36
          • 文章 - 10
          • 評(píng)論 - 94
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(5)

          隨筆分類(49)

          隨筆檔案(36)

          文章分類(11)

          文章檔案(10)

          相冊(cè)

          dyerac

          搜索

          •  

          積分與排名

          • 積分 - 79320
          • 排名 - 706

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           
          ?? 最近在嘗試做一個(gè)類似sourceforge的開(kāi)源社區(qū),因此需要為項(xiàng)目申請(qǐng)者提供遠(yuǎn)程SVN的配置。這里列出自己的代碼和心得,一是為了與大家相互交流,更重要的是為了讓各位提提意見(jiàn),看看還需要什么內(nèi)容。
          現(xiàn)在提供的功能有:
          ?? 為項(xiàng)目創(chuàng)建svn倉(cāng)庫(kù),修改svn賬戶密碼,修改svn權(quán)限配置等。
          ?? 大家覺(jué)得還需要什么呢?

          代碼如下:
          ? 首先定義一個(gè)異常:
          package?commandLineTest;

          class?SvnException?extends?Exception?{
          ????
          public?SvnException(String?s)?{
          ????????
          super(s);
          ????}

          }


          下面是對(duì)svn的操作:
          package?commandLineTest;

          import?java.io.BufferedReader;
          import?java.io.BufferedWriter;
          import?java.io.File;
          import?java.io.FileNotFoundException;
          import?java.io.FileReader;
          import?java.io.FileWriter;
          import?java.io.IOException;
          import?java.io.InputStreamReader;

          public?class?SvnCommander?{

          ????
          private?String?svn_home?=?"K:/subversion-repository/";

          ????
          /**
          ?????*?為指定項(xiàng)目在服務(wù)器創(chuàng)建svn倉(cāng)庫(kù),當(dāng)用戶選擇開(kāi)通svn服務(wù)時(shí),這個(gè)方法將被調(diào)用為用戶的項(xiàng)目創(chuàng)建svn倉(cāng)庫(kù)
          ?????*?
          ?????*?
          @param?project
          ?????*????????????需要?jiǎng)?chuàng)建svn倉(cāng)庫(kù)的項(xiàng)目的名稱
          ?????*?
          @throws?SvnException
          ?????*?????????????當(dāng)創(chuàng)建失敗時(shí)將拋出錯(cuò)誤
          ?????
          */

          ????
          public?void?createRepository(String?project)?throws?SvnException?{
          ????????
          try?{
          ????????????Process?p?
          =?new?ProcessBuilder("svnadmin",?"create",?svn_home
          ????????????????????
          +?project).start();
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          //?BufferedReader?reader=new?BufferedReader(new
          ????????????
          //?InputStreamReader(p.getInputStream()));
          ????????????
          //?while((tmp=reader.readLine())!=null)
          ????????????
          //?buffer.append(tmp);
          ????????????
          //?System.out.println(buffer.toString());
          ????????????
          //?buffer=new?StringBuffer();
          ????????????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(p
          ????????????????????.getErrorStream()));
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp);
          ????????????
          //?System.err.println(buffer.toString());
          ????????????if?(buffer.length()?>?0)
          ????????????????
          throw?new?SvnException(buffer.toString());
          ????????????initSvnServer(project);
          ????????????initAuthz(project);
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}


          ????}


          ????
          /**
          ?????*?用于修改svn倉(cāng)庫(kù)的svnserve.conf配置文件,這個(gè)方法將在
          @link?createRepository(String?name)
          ?????*?中被自動(dòng)調(diào)用,不建議被其他類調(diào)用
          ?????*?
          ?????*?
          @param?project
          ?????*????????????svn倉(cāng)庫(kù)對(duì)應(yīng)的項(xiàng)目名稱
          ?????*?
          @throws?SvnException
          ?????*?????????????當(dāng)用戶所在的項(xiàng)目并沒(méi)有開(kāi)通svn服務(wù),或者修改svnserve.conf文件出現(xiàn)io錯(cuò)誤時(shí)將拋出SvnException
          ?????
          */

          ????
          public?void?initSvnServer(String?project)?throws?SvnException?{
          ????????File?svnserve?
          =?new?File(svn_home?+?project?+?"/conf/svnserve.conf");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(svnserve));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?index?=?buffer.indexOf("#?anon");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?auth");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?pass");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?auth");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(svnserve));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件svnserve.conf未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件svnserve.conf的io操作出現(xiàn)問(wèn)題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?為用戶設(shè)置svn帳戶的密碼,
          ?????*?該方法將修改項(xiàng)目倉(cāng)庫(kù)的passwd文件,如果該用戶帳戶已存在于passwd文件中,將修改其密碼信息;如果不存在,則會(huì)在passwd添加新的記錄
          ?????*?
          ?????*?
          @param?project
          ?????*????????????用戶所在的項(xiàng)目名稱
          ?????*?
          @param?name
          ?????*????????????用戶帳戶名稱
          ?????*?
          @param?key
          ?????*????????????用戶密碼
          ?????*?
          @throws?SvnException
          ?????*?????????????當(dāng)用戶所在的項(xiàng)目并沒(méi)有開(kāi)通svn服務(wù),或者修改passwd文件出現(xiàn)io錯(cuò)誤時(shí)將拋出SvnException
          ?????
          */

          ????
          public?void?setPassword(String?project,?String?name,?String?key)
          ????????????
          throws?SvnException?{
          ????????File?file?
          =?new?File(svn_home?+?project);
          ????????
          if?(!file.exists())
          ????????????
          throw?new?SvnException("SvnException:?該項(xiàng)目還未開(kāi)通svn服務(wù)");
          ????????File?passwd?
          =?new?File(svn_home?+?project?+?"/conf/passwd");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(passwd));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?index?=?buffer.indexOf(name?+?"?=?");
          ????????????
          if?(index?!=?-1)?{
          ????????????????
          int?line_end?=?buffer.indexOf("\n",?index);
          ????????????????
          if?(line_end?==?-1)
          ????????????????????line_end?
          =?buffer.length();
          ????????????????buffer.replace(index?
          +?name.length()?+?3,?line_end,?key);
          ????????????}
          ?else?{
          ????????????????buffer.append(name?
          +?"?=?"?+?key);
          ????????????}

          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(passwd));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd的io操作出現(xiàn)問(wèn)題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          private?void?initAuthz(String?project)?throws?SvnException?{
          ????????File?template?
          =?new?File("authz_template.txt");
          ????????File?authz?
          =?new?File(svn_home?+?project?+?"/conf/authz");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(template));
          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(authz));
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????writer.write(tmp);
          ????????????reader.close();
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd的io操作出現(xiàn)問(wèn)題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?用于設(shè)置各個(gè)用戶對(duì)svn的使用權(quán)限
          ?????*?
          ?????*?
          @param?project
          ?????*????????????對(duì)應(yīng)的項(xiàng)目名稱
          ?????*?
          @param?path
          ?????*????????????權(quán)限對(duì)應(yīng)的文件夾,該參數(shù)應(yīng)該采取"/foo/bar"的形式,不然設(shè)置結(jié)果將不起作用
          ?????*?
          @param?name
          ?????*????????????用戶名稱,全部用戶應(yīng)該使用"*"來(lái)表示
          ?????*?
          @param?right
          ?????*????????????權(quán)限,為"r"或者"rw"兩種形式
          ?????
          */

          ????
          public?void?setAuthz(String?project,?String?path,?String?name,?String?right)
          ????????????
          throws?SvnException?{
          ????????File?passwd?
          =?new?File(svn_home?+?project?+?"/conf/authz");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(passwd));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?begin?=?buffer.indexOf("["?+?project?+?":"?+?path?+?"]");
          ????????????System.err.println(begin);
          ????????????
          if?(begin?!=?-1)?{
          ????????????????
          int?end?=?buffer.indexOf("["?+?project,?begin+1);
          ????????????????System.err.println(end);
          ????????????????
          if?(end?==?-1)
          ????????????????????end?
          =?buffer.length();
          ????????????????
          int?index?=?buffer.indexOf(name,?begin);
          ????????????????System.err.println(index);
          ????????????????
          if?(index?<?end?&&?index?!=?-1)?{
          ????????????????????
          int?line_end?=?buffer.indexOf("\n",?index);
          ????????????????????
          if?(line_end?==?-1)
          ????????????????????????line_end?
          =?buffer.length();
          ????????????????????buffer.replace(index?
          +?name.length()?+?3,?line_end,?right);
          ????????????????}
          ?else?{
          ????????????????????
          int?line_end?=?buffer.indexOf("\n",?begin);
          ????????????????????
          if?(line_end?==?-1)
          ????????????????????????line_end?
          =?buffer.length();
          ????????????????????buffer.insert(line_end?
          +?1,?name?+?"?=?"?+?right?+?"\n");
          ????????????????}

          ????????????}
          ?else?{
          ??????????????buffer.append(
          "["?+?project?+?":"?+?path?+?"]\n");
          ??????????????buffer.append(name?
          +?"?=?"?+?right?+?"\n");
          ????????????}

          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(passwd));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件authz未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件authz的io操作出現(xiàn)問(wèn)題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?
          @param?args
          ?????
          */

          ????
          public?static?void?main(String[]?args)?{
          ????????
          //?TODO?Auto-generated?method?stub
          ????????SvnCommander?s?=?new?SvnCommander();
          //????????try?{
          //????????????s.createRepository("lala");
          //????????}?catch?(SvnException?e)?{
          //????????????//?TODO?Auto-generated?catch?block
          //????????????System.err.print(e.toString());
          //????????}
          //?????????try?{
          //?????????s.setPassword("lala",?"td",?"12344321");
          //?????????}?catch?(SvnException?e)?{
          //?????????//?TODO?Auto-generated?catch?block
          //?????????System.err.print(e.toString());
          //?????????}
          ????????try?{
          ????????????s.setAuthz(
          "lala","/","haha","rw");
          ????????}
          ?catch?(SvnException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????System.err.print(e.toString());
          ????????}

          ????}

          }


          創(chuàng)建svn倉(cāng)庫(kù)是通過(guò)調(diào)用
          Process p = new ProcessBuilder("svnadmin", "create", svn_home
          ?????+ project).start();
          進(jìn)行的。同時(shí)捕捉系統(tǒng)的返回查看是否有異常
          BufferedReader reader = new BufferedReader(new InputStreamReader(p
          ?????.getErrorStream()));
          ???while ((tmp = reader.readLine()) != null)
          ????buffer.append(tmp);
          ???// System.err.println(buffer.toString());
          ???if (buffer.length() > 0)
          ????throw new SvnException(buffer.toString());

          而對(duì)密碼和權(quán)限的修改是通過(guò)對(duì)svn默認(rèn)的passwd以及authz文件進(jìn)行文本操作。
          另外既然是b/s模式當(dāng)然有顯示的頁(yè)面,礙于篇幅就不詳述咯
          最后,有兩個(gè)問(wèn)題還想請(qǐng)問(wèn)各位:

          1.對(duì)文本的操作難道只能讀入內(nèi)存修改后重新寫入嗎?有沒(méi)有比較高效的方法呢?

          2.還需要什么額外的功能?因?yàn)閟vn的一些基本操作(如導(dǎo)入導(dǎo)出)其實(shí)通過(guò)svn客戶端訪問(wèn)svn地址就可以了
          posted on 2006-10-21 22:30 dyerac in java... 閱讀(2830) 評(píng)論(4)  編輯  收藏 所屬分類: 原創(chuàng)文章JavaSE
          評(píng)論:
          • # re: B/S實(shí)現(xiàn)遠(yuǎn)程配置SVN  robinz-hbifts Posted @ 2006-10-22 00:30
            "對(duì)文本的操作..."
            對(duì)于普通的文本,只能這么做.沒(méi)有別的比較好的辦法.

            如果只是讀,可以讀一部分,再讀另一部分.
            如果要寫,就比較麻煩了~

            如果可能,可以考慮用M$的 復(fù)合文檔, 像Doc一樣的.  回復(fù)  更多評(píng)論   

          • # re: B/S實(shí)現(xiàn)遠(yuǎn)程配置SVN  HD Posted @ 2006-10-22 20:36
            應(yīng)該把a(bǔ)pache結(jié)合起來(lái)做。 :)
            svnd必必竟不是終級(jí)解決之道。  回復(fù)  更多評(píng)論   

          • # re: B/S實(shí)現(xiàn)遠(yuǎn)程配置SVN  dyerac in java... Posted @ 2006-10-22 22:39
            @HD
            什么意思?不是很懂誒  回復(fù)  更多評(píng)論   

          • # re: B/S實(shí)現(xiàn)遠(yuǎn)程配置SVN  Raymond Posted @ 2006-12-17 00:10
            結(jié)合數(shù)據(jù)庫(kù),只寫,不讀  回復(fù)  更多評(píng)論   

           
          Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 马鞍山市| 中阳县| 克东县| 伊川县| 炎陵县| 南澳县| 黄浦区| 准格尔旗| 龙泉市| 务川| 山阴县| 通渭县| 阿拉善左旗| 建平县| 拜城县| 沐川县| 广东省| 江山市| 陵水| 株洲市| 德清县| 米易县| 阿拉善右旗| 亚东县| 柏乡县| 都匀市| 宽城| 五华县| 富民县| 清镇市| 海口市| 丹凤县| 萨迦县| 丽江市| 荃湾区| 什邡市| 响水县| 星座| 中超| 安岳县| 土默特左旗|