• python利用pysvn发布lib的小程序


    背景:

        本人在公司的平台部门工作,我们部门写出的代码都是编译成.a文件,定期发布版本到各个产品,现在老大要求我负责每周向公司的某个产品发布lib。发布lib的步骤大概就是自动化的兄弟给我提供一个归档的版本号、lib的标签号(对应我们平台的代码)和产品适配的标签号(对应产品代码,我们的.a文件会定期提交到这个svn下),然后我根据这个信息,操作svn,定期把适配中指定标签下的指定的两个文件夹导出到归档目录下,然后在归档路径下创建记录这次发布信息(lib、适配各包含哪些标签、版本信息)的文档,还有就是创建一个release notes,要大家填写依赖。为了方便记录我还在另一个目录下记录着每次发布的信息。大概就是这样比较机械的操作,作为程序员当然不能甘于每周重复一次这样无趣的操作,于是乎利用今天调休的时间,用python写了个脚本代替这个工作。

        主要用到的是python和pysvn(python)的一个第三方库。这里注意下pysvn要和对应版本的python使用才能生效,否则import会失败,所以建议先选pysvn,然后根据版本选python。

    软件下载和使用文档:

        软件下载:https://www.python.org/getit/

                          http://pysvn.tigris.org/project_downloads.html

        pysvn非常好的官方使用说明文档:http://pysvn.tigris.org/docs/pysvn_prog_ref.html

    代码:

    import pysvn
    import os
    import time
    import shutil
    
    #发布lib时对应的适配代码路径
    code_path = "F:/xyp_work";
    #lib的归档路径
    dest_path = "F:/AR_lib发布";
    #自己的备份信息
    myself_save_path = "F:/save/备份.txt";
    #填写依赖的路径
    dependence_path = "F:/依赖";
    #维护一个专门记录lib和br标签号的文档用于读取上一次发lib时的标签号
    old_num_path = "F:/save/old_num.txt";
    
    #svn 路径
    lib_svn = "lib的svn路径"
    br_svn = "br的svn路径"
    
    #版本号和标签号
    #verson = "esap v2R2C00B100";
    #lib_num = 2;
    #br_num = 7;
    
    ###读取上一次的标签号和用户输入的本次lib的标签号和版本号###
    print("输入版本号");
    verson = input();
    print("输入lib的标签号");
    lib_num = int(input());
    print("输入适配的标签号");
    br_num = int(input());
    
    fp = open(old_num_path,"r");
    last_lib_num = fp.readline();
    last_br_num = fp.readline();  
    fp.close();
    
    print("last lib num is  "+str(last_lib_num));
    print("last br num is  "+str(last_br_num));
    print("current verson is "+str(verson)+"
    ");
    print("current lib num is  "+str(lib_num)+"
    ");
    print("current br num is  "+str(br_num)+"
    ");
    print("please confirm : y/n");
    
    res=input();
    if "y"== res:
        print("now start");
    else:
        exit();
    
    
    ###################创建文件夹和文件######################
    vasp = dest_path+'/'+"vasp";
    vaspadp = dest_path + '/' + "vaspadp";
    svn_txt = dest_path + '/'+"svn.txt";
    
    isExists=os.path.exists(dest_path);
    if not isExists:
        os.makedirs(dest_path);
    else:
        print("AR_lib发布文件夹已存在,看看是否搞错了");
        exit();
        
    isExists=os.path.exists(vasp)
    if not isExists:
        os.makedirs(vasp);
    
    isExists=os.path.exists(vaspadp)
    if not isExists:
        os.makedirs(vaspadp);
    
    #svn.txt 
    fp = open(svn_txt,"a");
    fp.write(verson+"
    ");
    fp.write((lib_svn+" "+ str(lib_num) +"
    "));
    fp.write((br_svn+" "+ str(br_num) +"
    "));
    fp.close();
    
    #自己的备份记录
    fp = open(myself_save_path,"a");
    fp.write("
    ");
    fp.write("
    ");
    fp.write("
    ");
    fp.write(time.strftime("%d/%m/%Y") + "
    ");
    fp.write(verson+"
    ");
    fp.write((lib_svn+" "+ str(lib_num) +"
    "));
    fp.write((br_svn+" "+ str(br_num) +"
    "));
    fp.close();
    
    #依赖文件 复制release notes.xlsx,然后重命名,否则直接创建出来不是共享的
    shutil.copyfile(dependence_path+"/release notes.xlsx",dependence_path + "/" + verson+" release notes.xlsx");
    
    #维护一个专门记录lib和br标签号的文档用于读取上一次发lib时的标签号
    fp = open(old_num_path,"w");
    fp.truncate(); #清除文件内容
    fp.write(str(lib_num)+"
    ");
    fp.write(str(br_num)+"
    ");
    fp.close();
    ##############################################
    
    pysvn_current_br_num = pysvn.Revision( pysvn.opt_revision_kind.number, br_num);
    pysvn_log_start = pysvn.Revision( pysvn.opt_revision_kind.number, last_lib_num);
    pysvn_log_end = pysvn.Revision( pysvn.opt_revision_kind.number, lib_num);
    """
    retcode - boolean, False if no username and password are available. True if subversion is to use the username and password.
    username - string, the username to uses
    password - string, the password to use
    save - boolean, return True if you want subversion to remember the username and password in the configuration directory. return False to prevent saving the username and password.
    """
    #def get_login( realm, username, may_save ):
    #    return retcode, username, password, save
    
    client = pysvn.Client()
    #client.callback_get_login = get_login
    
    client.revert(code_path,True);
    
    client.update(code_path,True,pysvn_current_br_num,False);
    
    client.export(code_path+"/vasp",vasp,True,pysvn_current_br_num,None,False);
    client.export(code_path+"/product/ar/vaspadp",vaspadp,True,pysvn_current_br_num,None,False);
    
    """
    log returns a list of log entries; each log entry is a dictionary. The dictionary contains: 
    author - string - the name of the author who committed the revision
    date - float time - the date of the commit
    message - string - the text of the log message for the commit
    revision - pysvn.Revision - the revision of the commit
    changed_paths - list of dictionaries. Each dictionary contains:
    path - string - the path in the repository
    action - string
    copyfrom_path - string - if copied, the original path, else None
    copyfrom_revision - pysvn.Revision - if copied, the revision of the original, else None
    """
    logmessege=client.log(code_path,pysvn_log_start,pysvn_log_end,False,False);
    log_file = dest_path + '/'+"log.txt";
    fp = open(log_file,"a");
    for log_one in logmessege:
        fp.write(log_one.author +" "+ log_one.message + "
    ");
    fp.close();
  • 相关阅读:
    local variable 'xxx' referenced before assignment(犯过同样的错)
    combobox后台查询,前端下拉显示
    查询时,模糊显示结果
    jgrid label时间格式化显示
    解决:dubbo找不到dubbo.xsd报错
    关于jsp页面下,重置选择框的数据的操作!
    关于return返回
    cmd下调用jar
    关于前台查询时,查询条件不同时,garitable域数据展示不同,这里要实现功能要做empty()操作,缓存问题。
    Python3练习题系列(10)——项目骨架构建
  • 原文地址:https://www.cnblogs.com/bewolf/p/7266210.html
Copyright © 2020-2023  润新知