Before it was a toss with Ruby, now learning Python, and then originally doing for a project, now for multiple projects,
Now record it.
#!/usr/bin/python# -*- coding:utf-8 -*-import reimport sysimport osimport filecmpimport smtplibimport tempfileimport linecacheimport datetimefrom email.mime.text import mimetext svn_ser = { "AAA": "http://bbb.163.net/svn/ AAA ", " BBB ":" http://aaa.163.net/ SVN/BBB " }svn_rel_ser = " svn_rel = " svn_rel_dir = "/branches" svn_tmp_dir = tempfile.mkdtemp () tar_list_name = svn_tmp_dir + "/tar.list" maillist = "/home/" + os.getlogin (). replace ('. ', ') + '/'. Maillist.txt "svn_name, svn_comment = ", "OLD_DIR&NBSP;=&NBSP;OS.GETCWD () run_user = ["Li.li", "Se.ni", "163"]def check_user (): if os.getlogin () in run_user: if&nbSp;not os.path.exists (maillist): print "Mail List File not exist! " print "Please vim /home/%s/.maillist.txt" % Os.getlogin (). replace ('. ', ') sys.exit (1) else: print "permission denied!" sys.exit (1) def send_mail (Tar_name, diff): ci_time = datetime.datetime.now (). Strftime ('%y-%m-%d %h:%m:%s ') mail_host= "smtp.163.com" mail_user= "[email protected]" mail_s= "ABCABC" sub = "Svn_release" content = " Module: RTL comment: %s version: %s tarname: %s tarsize: %s citime: %s ============= diffsvn: ====================== %s ========================================== ' % (Svn_comment, re.findall (' [0-9]{3} ', tar_name) [0], tar_name, Os.path.getsize (tar_name), ci_time, diff ) f = open (maillist, ' R ') for i in f: if not re.match (' ^# ', i): me= "SVN" + "<" +mail_user+ ">" msg = mimetext (content,_subtype= ' plain ', _charset= ' gb2312 ') msg[ ' Subject '] = sub msg[' from '] = me msg[' to '] = i try: server = smtplib. SMTP () server.connect (Mail_host) server.login (mail_user,mail_s) server.sendmail (me, i , msg.as_string ()) server.close () except Exception, e: print "Send to %s error" % i f.close () def usage (): tmp = " usage script project_name [comment] e.g. script AAA " Test by me " script aaa ' print Tmp def co_check (Co_ser): os.chdir (Svn_tmp_dir) os.system ("svn co %s/code/rtl 1>/dev/null 2>&1 " % co_ser) def create_tar_list (): file_path = [] tar_list = [] for filepath,pathname, Filename in os.walk (svn_tmp_dir): #filepath fullpath #pathname fullpath child dir #filename child dir file if os.path.exists (filepath + "/" + filepath.split ('/') [-1] + ". F"): file_path.append (filepath + "/" + filepath.split ('/') [-1] + '. F ') tmp_line = [] true_path = ' for i in file_path: f = open (i, ' R ') for line in f: if re.search (R ' ^\/\/', Line.strip ()): next elif re.search (R ' ^\.| ^\w+ ', Line.strip ()): if re.search (R ' \/\/', line): tmp_line = line.strip (). Split ('//') [0]. Rstrip (). Split ('/') else: tmp_line = line.strip (). Split ('/') if '. ' in tmp_line: del tmp_line[tmp_ Line.index ('. ')] if ' ... ' in tmp_line: del tmp_line[tmp_ Line.index ('.. ')] ture_path = os.path.dirname (i) + "/" + '/'. Join (Tmp_line) if os.path.isfile (Ture_path): tar_list.append ("." + ture_path.split (Svn_tmp_dir) [-1]) f.close () open ( tar_list _name, ' W '). Write (' \ n '. Join (Tar_list)) Def tar_file_name (): os.system (' cd %s && mkdir rel tmp && cd rel && svn co %s 1>/dev/null 2>&1 ' % (svn_tmp_dir, svn_rel_ser) #can not find tar? tmp_name = os.popen ("cd %s && file $ (svn log -v | grep ' tar.bz2 ' | awk ' {print \ '. \ "$NF} ') | grep -v error" % (svn_tmp_dir + "/rel /" + svn_rel "). Read () if tmp_name.strip () == ": if svn_name == "AAA": return [svn_name + "_RELEASE.001.TAR.BZ2"] else: return [svn _name + "_001.tar.bz2"] else: tmp_name = tmp_name.split ( ) [0].split ('/') [ -1].strip () [0:-1] if svn_name == ' AAA ': tmp_no = int (Tmp_name.split ('. ') [-3]) + 1 new_name = svn_name + "_release.%0 3D.TAR.BZ2 " % tmp_no returN [new_name,tmp_name.split ('/') [ -1]] else: tmp_ No = int (Tmp_name.split ('_') [ -1][0:3]) + 1 new_name = svn_name + "_%03D.TAR.BZ2" % tmp_no return [new_name,tmp_name.split ('/') [ -1]]def diff_svn (tar_name): diff_tmp = [] tar_path = "./rel" + os.popen ("cd %s/rel & & find . -name %s " % (svn_tmp_dir, tar_name). read (). Strip () [1:] os.system ("cd %s && tar xf %s -c %s" % (svn_tmp_dir , tar_path, svn_tmp_dir + "/tmp")) f = open (tar_list_name, ' R ') for i in f: i = i.strip () Filename = svn_tmp_dir + "/tmp" + i[1:] if os.path.isfile (svn_tmp_dir + "/tmp" &NBSP;+&NBSP;I[1:]): #exist file ---> cmp &NBSP;&NBSP;IF&NBSP;NOT&NBSP;FILECMP.CMP (svn_tmp_dir + i[1:],svn_tmp_dir + "/tmp" + i[1:]): diff_tmp.append (Os.path.dirname (I.strip ())) else: diff_tmp.append (Os.path.dirname (I.strip ())) f.close () return list (set (diff_tmp)) #-------------------------- if len (SYS.ARGV) <= 1: usage () sys.exit (1) Else : try: svn_name, svn_comment = str.upper (sys.argv[1]), Sys.argv[2] except: svn_name, svn_comment = str.upper ( SYS.ARGV[1]), "Auto rElease " if not svn_ser.has_key (svn_name): usage () sys.exit (1) if svn_name == ' AAA ': svn_rel_ser, svn_rel = svn_ser[svn_name] + "-rel", svn_name + "- REL " else: svn_rel_ser, svn_rel = svn_ser[svn_name] + "_rel", svn_name + "_rel" svn_rel_dir = svn_tmp_dir + "/ rel/" + svn_rel + "/branches " check_user () co_check ( svn_ Ser[svn_name]) create_tar_list () tar_name = tar_file_name () if "001" in tar_name[0]: diff = ' Else: diff = diff_svn (tar_name[1]) if len ( diff) == 0: diff = ' else: diff = "\ n". Join (diff)# svn ci if raw_input ("are you sure release? [y|n] \n ). Lower (). Strip () == "y": os.system ("cd %s && tar -jc -t tar.list -f %s " % (svn_tmp_dir, tar_name[0)) os.chdir (Svn_rel_dir) os.system ("MV&NBSP;.. /.. /.. /%s . " % tar_name[0]) os.system ("svn add %s" % tar_name[0]) Os.system ("svn ci %s -m '%s '" % (tar_name[0], svn_comment)) # send mail send_mail (Tar_name[0],diff) print "svn Release ok "Else: pass# delete temp fileos.chdir ('/tmp ') Os.system (' Rm -rf $ (ls -1 /tmp | grep -e "tmp[a-za-z0-9]+") sys.exit (0)
SVN Project Release Script