天天看點

Python基礎學習:svn導出差異檔案腳本

由于是剛接觸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>) &gt;</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,如需轉載請自行聯系原作者