由于是剛接觸python不久,是以很多都不是很熟練,隻能是用到什麼查點什麼。是以如果有什麼bug或者不嚴謹的文法或其他,希望各位看客指正。
鑒于公司的平台研發部門需求想直接把svn中的差異代碼導出并打包自動上傳到指定的伺服器上,然後在從指定的伺服器上進行一個釋出更新。由于我們開發和釋出伺服器的環境很特殊,中間牽扯到很多網絡代理。是以才這麼麻煩。
要求如下:
1、自動導出指定版本之間的差異檔案
2、根據給定的選項過濾出指定的檔案夾以及檔案;例如給定選項 a ,那就導出的檔案中隻保留admin的内容
3、自動打包這些内容并按照目前的時間命名
4、以FTP模式上傳到指定的伺服器
主要還是在windows下操作這些,實在想不出什麼好的方法,于是網絡搜尋求助。網絡真是個神奇的東西,當然我還是沒有搜到任何結果。于是加了一些腳本的群,随機的找一個管理者問下有沒有相關的腳本或思路。真是天無絕人之路。第一個請教的哥們就給了我一個回答。python可以搞定(當然給的指導肯定不止這些)。
于是當下又在學習python,順便就用這個來實作(其實是不知道用什麼來操作的)
在多次google、baidu之後。寫了以下的腳本,目前測試是能滿足基本需求的:
python的環境需求:py32-pysvn, python-3.2
python的官網就不用提供了吧。
使用方法:
在windows下dos裡切換到腳本存放目錄,然後使用腳本内給的用法進行腳本導出。導出的檔案夾是相對腳本存放路徑來的。
下面貼出代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<code>#-*- coding: utf-8 -*-</code>
<code>#!/usr/bin/env python</code>
<code># ====================================================================</code>
<code>#</code>
<code># svnchanged_export.py</code>
<code># Export Files in a revision Range</code>
<code># Usage: python SCRIPT_NAME.py -r beginRev:endRev [ --username user --password passwd ] svnurl site_version(a | s | p)</code>
<code># site_version: a [admin] s [static] p [platform]</code>
<code>import</code> <code>pysvn </code><code># http://pysvn.tigris.org/</code>
<code>import</code> <code>getopt, time, string, sys, shutil</code>
<code>import</code> <code>os, urllib, tarfile, getpass</code>
<code>import</code> <code>unicodedata</code>
<code>from</code> <code>urllib.parse </code><code>import</code> <code>urlparse</code>
<code>from</code> <code>ftplib </code><code>import</code> <code>FTP</code>
<code># Options by default</code>
<code>date_folder</code><code>=</code><code>time.strftime(r</code><code>"%Y%m%d%H%M%S"</code><code>, time.localtime())</code>
<code>#site_version="p"</code>
<code>#targetPath = "." # Current directory</code>
<code>export_dir</code><code>=</code><code>"xxxx"</code> <code># Change into a folder you want to export, The store path relative to the script</code>
<code>username </code><code>=</code> <code>""</code>
<code>password </code><code>=</code> <code>""</code>
<code>url </code><code>=</code> <code>""</code>
<code>ftp_host</code><code>=</code><code>"xxx.xxx.xxx.xxx"</code>
<code>ftp_port</code><code>=</code><code>xxx</code>
<code>ftp_user</code><code>=</code><code>'xxxx'</code>
<code>ftp_pass</code><code>=</code><code>'xxxx'</code>
<code>revision_min </code><code>=</code> <code>pysvn.Revision( pysvn.opt_revision_kind.number, </code><code>0</code> <code>)</code>
<code>revision_max </code><code>=</code> <code>pysvn.Revision( pysvn.opt_revision_kind.head )</code>
<code>hasRevision </code><code>=</code> <code>False</code>
<code>current_dir </code><code>=</code> <code>os.getcwd()</code>
<code>os.chdir(r</code><code>'%s/%s'</code> <code>%</code><code>(os.getcwd(),export_dir))</code>
<code>os.makedirs(r</code><code>'%s'</code> <code>%</code><code>(date_folder))</code>
<code>os.chdir(</code><code>'../'</code><code>)</code>
<code>targetPath</code><code>=</code><code>(r</code><code>"%s\%s"</code><code>) </code><code>%</code> <code>(export_dir,date_folder)</code>
<code>try</code><code>:</code>
<code> </code><code>optlist, args </code><code>=</code> <code>getopt.getopt (sys.argv[</code><code>1</code><code>:], </code><code>"r:u:p:"</code><code>,</code>
<code> </code><code>[</code><code>"revision="</code><code>, </code><code>"username="</code><code>, </code><code>"password="</code><code>])</code>
<code> </code><code>if</code> <code>len</code><code>(args) </code><code>=</code><code>=</code> <code>1</code> <code>or</code> <code>len</code><code>(args) </code><code>=</code><code>=</code> <code>2</code><code>:</code>
<code> </code><code>url </code><code>=</code> <code>args[</code><code>0</code><code>]</code>
<code> </code><code>if</code> <code>len</code><code>(args) </code><code>=</code><code>=</code> <code>2</code><code>:</code>
<code> </code><code>#targetPath = args[1]</code>
<code> </code><code>site_version </code><code>=</code> <code>args[</code><code>1</code><code>]</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>raise</code> <code>Exception (</code><code>"Input URL [site_version]"</code><code>)</code>
<code> </code>
<code> </code><code>for</code> <code>option, value </code><code>in</code> <code>optlist:</code>
<code> </code><code>if</code> <code>option </code><code>=</code><code>=</code> <code>"--username"</code> <code>or</code> <code>option </code><code>=</code><code>=</code> <code>"-u"</code><code>:</code>
<code> </code><code>username </code><code>=</code> <code>value </code>
<code> </code><code>elif</code> <code>option </code><code>=</code><code>=</code> <code>"--password"</code> <code>or</code> <code>option </code><code>=</code><code>=</code> <code>"-p"</code><code>:</code>
<code> </code><code>password </code><code>=</code> <code>value</code>
<code> </code><code>elif</code> <code>option </code><code>=</code><code>=</code> <code>"--revision"</code> <code>or</code> <code>option </code><code>=</code><code>=</code> <code>"-r"</code><code>:</code>
<code> </code><code>revision </code><code>=</code> <code>value</code>
<code> </code><code>if</code> <code>str</code><code>.find(value, </code><code>":"</code><code>) ></code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>(revision_min0, revision_max0) </code><code>=</code> <code>str</code><code>.split(value, </code><code>":"</code><code>)</code>
<code> </code><code>revision_min </code><code>=</code> <code>pysvn.Revision( pysvn.opt_revision_kind.number, </code><code>int</code><code>(revision_min0) )</code>
<code> </code><code>if</code> <code>revision_max0 !</code><code>=</code> <code>"HEAD"</code><code>:</code>
<code> </code><code>revision_max </code><code>=</code> <code>pysvn.Revision( pysvn.opt_revision_kind.number, </code><code>int</code><code>(revision_max0) )</code>
<code> </code><code>hasRevision </code><code>=</code> <code>True</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>raise</code> <code>Exception (</code><code>"Please Input revision range "</code> <code>+</code> <code>str</code><code>(option))</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>raise</code> <code>Exception (</code><code>"Unknown option "</code> <code>+</code> <code>str</code><code>(option))</code>
<code> </code>
<code> </code><code>if</code> <code>hasRevision </code><code>=</code><code>=</code> <code>False</code><code>:</code>
<code> </code><code>raise</code> <code>Exception (</code><code>"Please Input Revision Range -r min:max"</code><code>)</code>
<code> </code><code>#urlObject = urlparse(url)</code>
<code> </code><code>#if urlObject.scheme == 'http' or urlObject.scheme == 'https':</code>
<code> </code><code># url = urlObject.scheme+"://"+urlObject.netloc+urllib.quote(urlObject.path.decode(sys.stdin.encoding).encode('utf8'))</code>
<code> </code><code>#else:</code>
<code> </code><code>#url = unicode(url, sys.stdin.encoding)</code>
<code> </code><code>#print (sys.stdin.encoding)</code>
<code> </code><code># print(url)</code>
<code> </code><code>if</code> <code>not</code> <code>url.endswith(</code><code>"/"</code><code>):</code>
<code> </code><code>url </code><code>=</code> <code>url </code><code>+</code> <code>"/"</code>
<code>except</code> <code>getopt.error as reason:</code>
<code> </code><code>raise</code> <code>Exception(</code><code>"Usage: "</code> <code>+</code> <code>sys.argv[</code><code>0</code><code>] </code><code>+</code> <code>": "</code> <code>+</code> <code>str</code><code>(reason))</code>
<code>f_list</code><code>=</code><code>[]</code>
<code>f_list</code><code>=</code><code>os.listdir(targetPath)</code>
<code> </code>
<code>for</code> <code>f </code><code>in</code> <code>f_list:</code>
<code> </code><code>f_path</code><code>=</code><code>os.path.join(targetPath, f)</code>
<code> </code><code>if</code> <code>os.path.isfile(f_path):</code>
<code> </code><code>os.remove(f_path)</code>
<code> </code><code>print</code> <code>(f_path</code><code>+</code><code>" removed."</code><code>)</code>
<code> </code><code>shutil.rmtree(f_path)</code>
<code> </code><code>print</code> <code>(f_path</code><code>+</code> <code>" removed."</code><code>)</code>
<code>print</code> <code>(targetPath</code><code>+</code><code>" is already empty."</code><code>)</code>
<code> </code>
<code>def</code> <code>get_login(realm,user,may_save):</code>
<code> </code><code>return</code> <code>True</code><code>, username, password, </code><code>False</code>
<code> </code>
<code>print</code> <code>(</code><code>"SVN Path:"</code><code>+</code><code>url</code><code>+</code><code>' '</code><code>+</code><code>"Diff file path:"</code><code>+</code><code>targetPath)</code>
<code>client </code><code>=</code> <code>pysvn.Client()</code>
<code>if</code> <code>username !</code><code>=</code> <code>"</code><code>" and password != "</code><code>":</code>
<code> </code><code>client.callback_get_login </code><code>=</code> <code>get_login</code>
<code>summary </code><code>=</code> <code>client.diff_summarize(url, revision_min, url, revision_max)</code>
<code>#print summary</code>
<code>for</code> <code>changed </code><code>in</code> <code>summary:</code>
<code> </code><code>#path, summarize_kind, node_kind, prop_changed</code>
<code> </code><code>#for key in changed.iterkeys():</code>
<code> </code><code># print key </code>
<code> </code><code>if</code> <code>pysvn.diff_summarize_kind.delete </code><code>=</code><code>=</code> <code>changed[</code><code>'summarize_kind'</code><code>]:</code>
<code> </code><code>fullPath </code><code>=</code> <code>targetPath</code><code>+</code><code>"/"</code><code>+</code><code>changed[</code><code>'path'</code><code>] </code>
<code> </code><code>if</code> <code>os.path.exists(fullPath):</code>
<code> </code><code>os.remove(fullPath)</code>
<code> </code><code>if</code> <code>pysvn.diff_summarize_kind.added </code><code>=</code><code>=</code> <code>changed[</code><code>'summarize_kind'</code><code>] </code><code>or</code> <code>pysvn.diff_summarize_kind.modified </code><code>=</code><code>=</code> <code>changed[</code><code>'summarize_kind'</code><code>]:</code>
<code> </code><code>print</code> <code>(changed[</code><code>'summarize_kind'</code><code>], changed[</code><code>'path'</code><code>])</code>
<code> </code><code>if</code> <code>changed[</code><code>'node_kind'</code><code>] </code><code>=</code><code>=</code> <code>pysvn.node_kind.</code><code>file</code><code>:</code>
<code> </code><code>#uniPath = changed['path'].decode('utf8').encode()</code>
<code> </code><code>file_text </code><code>=</code> <code>client.cat(url</code><code>+</code><code>urllib.parse.quote(changed[</code><code>'path'</code><code>].encode(</code><code>'utf8'</code><code>)), revision_max)</code>
<code> </code><code>fullPath </code><code>=</code> <code>targetPath</code><code>+</code><code>"/"</code><code>+</code><code>changed[</code><code>'path'</code><code>] </code>
<code> </code><code>dirPath </code><code>=</code> <code>fullPath[</code><code>0</code><code>:fullPath.rfind(</code><code>"/"</code><code>)]</code>
<code> </code><code>if</code> <code>not</code> <code>os.path.exists(dirPath):</code>
<code> </code><code>os.makedirs(dirPath)</code>
<code> </code>
<code> </code><code>f </code><code>=</code> <code>open</code><code>(fullPath,</code><code>'wb'</code><code>)</code>
<code> </code><code>f.write(file_text)</code>
<code> </code><code>f.close</code>
<code> </code><code>#f = open(fullPath,'wb')</code>
<code> </code><code>#f.write(file_text)</code>
<code> </code><code>#f.close</code>
<code>#f_tar="./"+os.path.basename(targetPath)+".tar"</code>
<code>#if os.path.exists(f_tar):</code>
<code># os.remove(f_tar)</code>
<code># print (os.path.basename(f_tar)+" is removed.")</code>
<code>#else:</code>
<code># print (os.path.basename(f_tar)+" is not exists.")</code>
<code># Folder filter regulation</code>
<code>os.chdir((r</code><code>"%s"</code><code>) </code><code>%</code> <code>targetPath)</code>
<code>p_list </code><code>=</code> <code>a_list </code><code>=</code> <code>s_list </code><code>=</code> <code>os.listdir(os.getcwd())</code>
<code>p_outer_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"website"</code> <code>and</code> <code>x !</code><code>=</code> <code>"framework"</code><code>, p_list))</code>
<code>a_outer_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"website"</code> <code>and</code> <code>x !</code><code>=</code> <code>"framework"</code> <code>and</code> <code>x !</code><code>=</code> <code>"service"</code><code>, a_list))</code>
<code>s_outer_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"website"</code><code>, s_list))</code>
<code>os.chdir((r</code><code>"%s\website"</code><code>) </code><code>%</code> <code>targetPath)</code>
<code>p_inner_list </code><code>=</code> <code>a_inner_list </code><code>=</code> <code>s_inner_list </code><code>=</code> <code>os.listdir(os.getcwd())</code>
<code>p_inner_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"platform"</code><code>, p_inner_list))</code>
<code>a_inner_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"admin"</code> <code>and</code> <code>x !</code><code>=</code> <code>"union"</code><code>, a_inner_list))</code>
<code>s_inner_list </code><code>=</code> <code>list</code><code>(</code><code>filter</code><code>(</code><code>lambda</code> <code>x:x !</code><code>=</code> <code>"static"</code><code>, s_inner_list))</code>
<code>def</code> <code>inner_filter(list_op):</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>list_op:</code>
<code> </code><code>shutil.rmtree((r</code><code>"%s\website\%s"</code><code>) </code><code>%</code> <code>(targetPath,i))</code>
<code> </code><code>os.chdir((r</code><code>"%s"</code><code>) </code><code>%</code> <code>t_path)</code>
<code> </code><code>print</code> <code>(os.listdir(os.getcwd()))</code>
<code>def</code> <code>filter_site(site_op):</code>
<code> </code><code>if</code> <code>site_version </code><code>=</code><code>=</code> <code>"p"</code><code>:</code>
<code> </code><code>for</code> <code>p_o </code><code>in</code> <code>p_outer_list:</code>
<code> </code><code>shutil.rmtree((r</code><code>"%s\%s"</code><code>) </code><code>%</code> <code>(targetPath,p_o))</code>
<code> </code><code>inner_filter(p_inner_list)</code>
<code> </code><code>elif</code> <code>site_version </code><code>=</code><code>=</code> <code>"a"</code><code>:</code>
<code> </code><code>for</code> <code>a_o </code><code>in</code> <code>a_outer_list:</code>
<code> </code><code>shutil.rmtree((r</code><code>"%s\%s"</code><code>) </code><code>%</code> <code>(targetPath,a_o))</code>
<code> </code><code>inner_filter(a_inner_list)</code>
<code> </code><code>elif</code> <code>site_version </code><code>=</code><code>=</code> <code>"s"</code><code>:</code>
<code> </code><code>for</code> <code>s_o </code><code>in</code> <code>s_outer_list:</code>
<code> </code><code>shutil.rmtree((r</code><code>"%s\%s"</code><code>) </code><code>%</code> <code>(targetPath,s_o))</code>
<code> </code><code>inner_filter(s_inner_list)</code>
<code> </code><code>raise</code> <code>Exception ((</code><code>"Unknown site_option: %s"</code><code>) </code><code>%</code> <code>site_op)</code>
<code>filter_site(site_version)</code>
<code>print</code> <code>((</code><code>"export file: %s_%s"</code><code>+</code><code>'.tar'</code><code>) </code><code>%</code> <code>(site_version,date_folder)) </code>
<code>def</code> <code>make_tar(folder_to_tar,dst_folder):</code>
<code> </code><code>fold_name </code><code>=</code> <code>os.path.basename(folder_to_tar)</code>
<code> </code><code>dst_name </code><code>=</code> <code>"%s_%s.tar"</code> <code>%</code><code>(site_version,fold_name)</code>
<code> </code><code>dst_path </code><code>=</code> <code>os.path.join(dst_folder, dst_name) </code>
<code> </code><code>tar </code><code>=</code> <code>tarfile.TarFile.</code><code>open</code><code>(dst_path, </code><code>'w'</code><code>)</code>
<code> </code><code>tar.add(folder_to_tar, fold_name)</code>
<code> </code><code>tar.close()</code>
<code> </code><code>return</code> <code>dst_path</code>
<code>dst_file </code><code>=</code> <code>make_tar(targetPath,</code><code>'./'</code><code>)</code>
<code># print (dst_file)</code>
<code>def</code> <code>upload_file(localfile):</code>
<code> </code><code>ftp</code><code>=</code><code>FTP()</code>
<code> </code><code>ftp.connect(ftp_host,ftp_port)</code>
<code> </code><code>ftp.login(ftp_user,ftp_pass)</code>
<code> </code><code>ftp.cwd(</code><code>'./'</code><code>)</code>
<code> </code><code>file</code><code>=</code><code>open</code><code>(localfile,</code><code>'rb'</code><code>)</code>
<code> </code><code>ftp.storbinary(</code><code>'STOR %s'</code> <code>%</code> <code>os.path.basename(localfile),</code><code>file</code><code>)</code>
<code> </code><code>ftp.retrlines(</code><code>'LIST'</code><code>)</code>
<code> </code><code>file</code><code>.close()</code>
<code> </code><code>ftp.close()</code>
<code> </code><code>ftp.quit</code>
<code>upload_file(dst_file)</code>
<code>print</code> <code>(</code><code>'File Upload Successful.'</code><code>)</code>
代碼就是如上這麼多,中間肯定有很多文法的不嚴謹和bug,大家多多指正。如有需要的可以直接拿去對應的改改基本上也是可以用的。
本文轉自Mr_陳 51CTO部落格,原文連結:http://blog.51cto.com/chenpipi/1604039,如需轉載請自行聯系原作者