dyerac  
dyerac In Java
公告

日历
<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234
统计
  • 随笔 - 36
  • 文章 - 10
  • 评论 - 94
  • 引用 - 0

导航

常用链接

留言簿(5)

随笔分类(49)

随笔档案(36)

文章分类(11)

文章档案(10)

相册

dyerac

搜索

  •  

积分与排名

  • 积分 - 78705
  • 排名 - 706

最新随笔

最新评论

阅读排行榜

评论排行榜

 
   最近在尝试做一个类似sourceforge的开源社区,因此需要为项目申请者提供远程SVN的配置。这里列出自己的代码和心得,一是为了与大家相互交流,更重要的是为了让各位提提意见,看看还需要什么内容。
现在提供的功能有:
   为项目创建svn仓库,修改svn账户密码,修改svn权限配置等。
   大家觉得还需要什么呢?

代码如下:
  首先定义一个异常:
package commandLineTest;

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

}


下面是对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/";

    
/**
     * 为指定项目在服务器创建svn仓库,当用户选择开通svn服务时,这个方法将被调用为用户的项目创建svn仓库
     * 
     * 
@param project
     *            需要创建svn仓库的项目的名称
     * 
@throws SvnException
     *             当创建失败时将抛出错误
     
*/

    
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仓库的svnserve.conf配置文件,这个方法将在
@link createRepository(String name)
     * 中被自动调用,不建议被其他类调用
     * 
     * 
@param project
     *            svn仓库对应的项目名称
     * 
@throws SvnException
     *             当用户所在的项目并没有开通svn服务,或者修改svnserve.conf文件出现io错误时将抛出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操作出现问题: "
                    
+ e.toString());
        }

    }


    
/**
     * 为用户设置svn帐户的密码,
     * 该方法将修改项目仓库的passwd文件,如果该用户帐户已存在于passwd文件中,将修改其密码信息;如果不存在,则会在passwd添加新的记录
     * 
     * 
@param project
     *            用户所在的项目名称
     * 
@param name
     *            用户帐户名称
     * 
@param key
     *            用户密码
     * 
@throws SvnException
     *             当用户所在的项目并没有开通svn服务,或者修改passwd文件出现io错误时将抛出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: 该项目还未开通svn服务");
        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操作出现问题: "
                    
+ 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操作出现问题: "
                    
+ e.toString());
        }

    }


    
/**
     * 用于设置各个用户对svn的使用权限
     * 
     * 
@param project
     *            对应的项目名称
     * 
@param path
     *            权限对应的文件夹,该参数应该采取"/foo/bar"的形式,不然设置结果将不起作用
     * 
@param name
     *            用户名称,全部用户应该使用"*"来表示
     * 
@param right
     *            权限,为"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操作出现问题: "
                    
+ 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());
        }

    }

}


创建svn仓库是通过调用
Process p = new ProcessBuilder("svnadmin", "create", svn_home
     + project).start();
进行的。同时捕捉系统的返回查看是否有异常
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());

而对密码和权限的修改是通过对svn默认的passwd以及authz文件进行文本操作。
另外既然是b/s模式当然有显示的页面,碍于篇幅就不详述咯
最后,有两个问题还想请问各位:

1.对文本的操作难道只能读入内存修改后重新写入吗?有没有比较高效的方法呢?

2.还需要什么额外的功能?因为svn的一些基本操作(如导入导出)其实通过svn客户端访问svn地址就可以了
posted on 2006-10-21 22:30 dyerac in java... 阅读(2817) 评论(4)  编辑  收藏 所属分类: 原创文章JavaSE
评论:
  • # re: B/S实现远程配置SVN  robinz-hbifts Posted @ 2006-10-22 00:30
    "对文本的操作..."
    对于普通的文本,只能这么做.没有别的比较好的办法.

    如果只是读,可以读一部分,再读另一部分.
    如果要写,就比较麻烦了~

    如果可能,可以考虑用M$的 复合文档, 像Doc一样的.  回复  更多评论   

  • # re: B/S实现远程配置SVN  HD Posted @ 2006-10-22 20:36
    应该把apache结合起来做。 :)
    svnd必必竟不是终级解决之道。  回复  更多评论   

  • # re: B/S实现远程配置SVN  dyerac in java... Posted @ 2006-10-22 22:39
    @HD
    什么意思?不是很懂诶  回复  更多评论   

  • # re: B/S实现远程配置SVN  Raymond Posted @ 2006-12-17 00:10
    结合数据库,只写,不读  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © dyerac in java... Powered by: 博客园 模板提供:沪江博客