Plugins/VcsPlugins/vcsSubversion/subversion.py

changeset 12
1d8dd9706f46
parent 6
52e8c820d0dd
child 13
1af94a91f439
equal deleted inserted replaced
11:b0996e4a289e 12:1d8dd9706f46
8 """ 8 """
9 9
10 import os 10 import os
11 import shutil 11 import shutil
12 import types 12 import types
13 import urllib 13 import urllib.request, urllib.parse, urllib.error
14 14
15 from PyQt4.QtCore import * 15 from PyQt4.QtCore import *
16 from PyQt4.QtGui import * 16 from PyQt4.QtGui import *
17 17
18 from E4Gui.E4Application import e4App 18 from E4Gui.E4Application import e4App
19 19
20 from VCS.VersionControl import VersionControl 20 from VCS.VersionControl import VersionControl
21 21
22 from SvnDialog import SvnDialog 22 from .SvnDialog import SvnDialog
23 from SvnCommitDialog import SvnCommitDialog 23 from .SvnCommitDialog import SvnCommitDialog
24 from SvnLogDialog import SvnLogDialog 24 from .SvnLogDialog import SvnLogDialog
25 from SvnLogBrowserDialog import SvnLogBrowserDialog 25 from .SvnLogBrowserDialog import SvnLogBrowserDialog
26 from SvnDiffDialog import SvnDiffDialog 26 from .SvnDiffDialog import SvnDiffDialog
27 from SvnRevisionSelectionDialog import SvnRevisionSelectionDialog 27 from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
28 from SvnStatusDialog import SvnStatusDialog 28 from .SvnStatusDialog import SvnStatusDialog
29 from SvnTagDialog import SvnTagDialog 29 from .SvnTagDialog import SvnTagDialog
30 from SvnTagBranchListDialog import SvnTagBranchListDialog 30 from .SvnTagBranchListDialog import SvnTagBranchListDialog
31 from SvnCopyDialog import SvnCopyDialog 31 from .SvnCopyDialog import SvnCopyDialog
32 from SvnCommandDialog import SvnCommandDialog 32 from .SvnCommandDialog import SvnCommandDialog
33 from SvnSwitchDialog import SvnSwitchDialog 33 from .SvnSwitchDialog import SvnSwitchDialog
34 from SvnMergeDialog import SvnMergeDialog 34 from .SvnMergeDialog import SvnMergeDialog
35 from SvnPropListDialog import SvnPropListDialog 35 from .SvnPropListDialog import SvnPropListDialog
36 from SvnPropSetDialog import SvnPropSetDialog 36 from .SvnPropSetDialog import SvnPropSetDialog
37 from SvnOptionsDialog import SvnOptionsDialog 37 from .SvnOptionsDialog import SvnOptionsDialog
38 from SvnNewProjectOptionsDialog import SvnNewProjectOptionsDialog 38 from .SvnNewProjectOptionsDialog import SvnNewProjectOptionsDialog
39 from SvnBlameDialog import SvnBlameDialog 39 from .SvnBlameDialog import SvnBlameDialog
40 from SvnRelocateDialog import SvnRelocateDialog 40 from .SvnRelocateDialog import SvnRelocateDialog
41 from SvnUrlSelectionDialog import SvnUrlSelectionDialog 41 from .SvnUrlSelectionDialog import SvnUrlSelectionDialog
42 from SvnRepoBrowserDialog import SvnRepoBrowserDialog 42 from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
43 from SvnStatusMonitorThread import SvnStatusMonitorThread 43 from .SvnStatusMonitorThread import SvnStatusMonitorThread
44 44
45 from ProjectBrowserHelper import SvnProjectBrowserHelper 45 from .ProjectBrowserHelper import SvnProjectBrowserHelper
46 from ProjectHelper import SvnProjectHelper 46 from .ProjectHelper import SvnProjectHelper
47 47
48 import Preferences 48 import Preferences
49 import Utilities 49 import Utilities
50 50
51 class Subversion(VersionControl): 51 class Subversion(VersionControl):
99 ] 99 ]
100 100
101 self.commandHistory = [] 101 self.commandHistory = []
102 self.wdHistory = [] 102 self.wdHistory = []
103 103
104 if os.environ.has_key("SVN_ASP_DOT_NET_HACK"): 104 if "SVN_ASP_DOT_NET_HACK" in os.environ:
105 self.adminDir = '_svn' 105 self.adminDir = '_svn'
106 else: 106 else:
107 self.adminDir = '.svn' 107 self.adminDir = '.svn'
108 108
109 self.log = None 109 self.log = None
164 procStarted = process.waitForStarted() 164 procStarted = process.waitForStarted()
165 if procStarted: 165 if procStarted:
166 finished = process.waitForFinished(30000) 166 finished = process.waitForFinished(30000)
167 if finished and process.exitCode() == 0: 167 if finished and process.exitCode() == 0:
168 output = \ 168 output = \
169 unicode(process.readAllStandardOutput(), ioEncoding, 'replace') 169 str(process.readAllStandardOutput(), ioEncoding, 'replace')
170 self.versionStr = output.split()[2] 170 self.versionStr = output.split()[2]
171 return True, errMsg 171 return True, errMsg
172 else: 172 else:
173 if finished: 173 if finished:
174 errMsg = \ 174 errMsg = \
279 os.mkdir(os.path.join(tmpDir, project, 'branches')) 279 os.mkdir(os.path.join(tmpDir, project, 'branches'))
280 os.mkdir(os.path.join(tmpDir, project, 'tags')) 280 os.mkdir(os.path.join(tmpDir, project, 'tags'))
281 shutil.copytree(projectDir, os.path.join(tmpDir, project, 'trunk')) 281 shutil.copytree(projectDir, os.path.join(tmpDir, project, 'trunk'))
282 else: 282 else:
283 shutil.copytree(projectDir, os.path.join(tmpDir, project)) 283 shutil.copytree(projectDir, os.path.join(tmpDir, project))
284 except OSError, e: 284 except OSError as e:
285 if os.path.isdir(tmpDir): 285 if os.path.isdir(tmpDir):
286 shutil.rmtree(tmpDir, True) 286 shutil.rmtree(tmpDir, True)
287 return False, False 287 return False, False
288 288
289 args = [] 289 args = []
471 for changelist in changelists: 471 for changelist in changelists:
472 args.append("--changelist") 472 args.append("--changelist")
473 args.append(changelist) 473 args.append(changelist)
474 args.append("-m") 474 args.append("-m")
475 args.append(msg) 475 args.append(msg)
476 if type(name) is types.ListType: 476 if isinstance(name, list):
477 dname, fnames = self.splitPathList(name) 477 dname, fnames = self.splitPathList(name)
478 self.addArguments(args, fnames) 478 self.addArguments(args, fnames)
479 else: 479 else:
480 dname, fname = self.splitPath(name) 480 dname, fname = self.splitPath(name)
481 args.append(fname) 481 args.append(fname)
508 self.addArguments(args, self.options['global']) 508 self.addArguments(args, self.options['global'])
509 self.addArguments(args, self.options['update']) 509 self.addArguments(args, self.options['update'])
510 if self.versionStr >= '1.5.0': 510 if self.versionStr >= '1.5.0':
511 args.append('--accept') 511 args.append('--accept')
512 args.append('postpone') 512 args.append('postpone')
513 if type(name) is types.ListType: 513 if isinstance(name, list):
514 dname, fnames = self.splitPathList(name) 514 dname, fnames = self.splitPathList(name)
515 self.addArguments(args, fnames) 515 self.addArguments(args, fnames)
516 else: 516 else:
517 dname, fname = self.splitPath(name) 517 dname, fname = self.splitPath(name)
518 args.append(fname) 518 args.append(fname)
543 self.addArguments(args, self.options['add']) 543 self.addArguments(args, self.options['add'])
544 args.append('--non-recursive') 544 args.append('--non-recursive')
545 if noDialog and '--force' not in args: 545 if noDialog and '--force' not in args:
546 args.append('--force') 546 args.append('--force')
547 547
548 if type(name) is types.ListType: 548 if isinstance(name, list):
549 if isDir: 549 if isDir:
550 dname, fname = os.path.split(name[0]) 550 dname, fname = os.path.split(name[0])
551 else: 551 else:
552 dname, fnames = self.splitPathList(name) 552 dname, fnames = self.splitPathList(name)
553 else: 553 else:
562 tree.insert(-1, dname) 562 tree.insert(-1, dname)
563 dname = os.path.split(dname)[0] 563 dname = os.path.split(dname)[0]
564 wdir = dname 564 wdir = dname
565 self.addArguments(args, tree) 565 self.addArguments(args, tree)
566 566
567 if type(name) is types.ListType: 567 if isinstance(name, list):
568 tree2 = [] 568 tree2 = []
569 for n in name: 569 for n in name:
570 d = os.path.split(n)[0] 570 d = os.path.split(n)[0]
571 while not os.path.exists(os.path.join(d, self.adminDir)): 571 while not os.path.exists(os.path.join(d, self.adminDir)):
572 if d in tree2 + tree: 572 if d in tree2 + tree:
608 args.append('add') 608 args.append('add')
609 self.addArguments(args, self.options['global']) 609 self.addArguments(args, self.options['global'])
610 self.addArguments(args, self.options['add']) 610 self.addArguments(args, self.options['add'])
611 611
612 tree = [] 612 tree = []
613 if type(path) is types.ListType: 613 if isinstance(path, list):
614 dname, fnames = self.splitPathList(path) 614 dname, fnames = self.splitPathList(path)
615 for n in path: 615 for n in path:
616 d = os.path.split(n)[0] 616 d = os.path.split(n)[0]
617 while not os.path.exists(os.path.join(d, self.adminDir)): 617 while not os.path.exists(os.path.join(d, self.adminDir)):
618 # add directories recursively, 618 # add directories recursively,
630 tree.insert(-1, dname) 630 tree.insert(-1, dname)
631 dname = os.path.split(dname)[0] 631 dname = os.path.split(dname)[0]
632 if tree: 632 if tree:
633 self.vcsAdd(tree, True) 633 self.vcsAdd(tree, True)
634 634
635 if type(path) is types.ListType: 635 if isinstance(path, list):
636 self.addArguments(args, path) 636 self.addArguments(args, path)
637 else: 637 else:
638 args.append(path) 638 args.append(path)
639 639
640 dia = SvnDialog(\ 640 dia = SvnDialog(\
659 self.addArguments(args, self.options['global']) 659 self.addArguments(args, self.options['global'])
660 self.addArguments(args, self.options['remove']) 660 self.addArguments(args, self.options['remove'])
661 if noDialog and '--force' not in args: 661 if noDialog and '--force' not in args:
662 args.append('--force') 662 args.append('--force')
663 663
664 if type(name) is types.ListType: 664 if isinstance(name, list):
665 self.addArguments(args, name) 665 self.addArguments(args, name)
666 else: 666 else:
667 args.append(name) 667 args.append(name)
668 668
669 if noDialog: 669 if noDialog:
716 if rx_prot.exactMatch(target): 716 if rx_prot.exactMatch(target):
717 args.append('--message') 717 args.append('--message')
718 args.append('Moving {0} to {1}'.format(name, target)) 718 args.append('Moving {0} to {1}'.format(name, target))
719 target = self.__svnURL(target) 719 target = self.__svnURL(target)
720 else: 720 else:
721 target = unicode(target) 721 target = str(target)
722 args.append(name) 722 args.append(name)
723 args.append(target) 723 args.append(target)
724 724
725 if noDialog: 725 if noDialog:
726 res = self.startSynchronizedProcess(QProcess(), "svn", args) 726 res = self.startSynchronizedProcess(QProcess(), "svn", args)
764 are saved first. If name is a file (or list of files), which is/are being edited 764 are saved first. If name is a file (or list of files), which is/are being edited
765 and has unsaved modification, they can be saved or the operation may be aborted. 765 and has unsaved modification, they can be saved or the operation may be aborted.
766 766
767 @param name file/directory name to be diffed (string) 767 @param name file/directory name to be diffed (string)
768 """ 768 """
769 if type(name) is types.ListType: 769 if isinstance(name, list):
770 names = name[:] 770 names = name[:]
771 else: 771 else:
772 names = [name] 772 names = [name]
773 for nam in names: 773 for nam in names:
774 if os.path.isfile(nam): 774 if os.path.isfile(nam):
838 """ be aborted""")) 838 """ be aborted"""))
839 return 839 return
840 840
841 reposRoot = rx_base.cap(1) 841 reposRoot = rx_base.cap(1)
842 if tagOp in [1, 4]: 842 if tagOp in [1, 4]:
843 url = '%s/tags/%s' % (reposRoot, urllib.quote(tag)) 843 url = '%s/tags/%s' % (reposRoot, urllib.parse.quote(tag))
844 elif tagOp in [2, 8]: 844 elif tagOp in [2, 8]:
845 url = '%s/branches/%s' % (reposRoot, urllib.quote(tag)) 845 url = '%s/branches/%s' % (reposRoot, urllib.parse.quote(tag))
846 else: 846 else:
847 url = self.__svnURL(tag) 847 url = self.__svnURL(tag)
848 848
849 args = [] 849 args = []
850 if tagOp in [1, 2]: 850 if tagOp in [1, 2]:
876 @param name file/directory name to be reverted (string) 876 @param name file/directory name to be reverted (string)
877 """ 877 """
878 args = [] 878 args = []
879 args.append('revert') 879 args.append('revert')
880 self.addArguments(args, self.options['global']) 880 self.addArguments(args, self.options['global'])
881 if type(name) is types.ListType: 881 if isinstance(name, list):
882 self.addArguments(args, name) 882 self.addArguments(args, name)
883 else: 883 else:
884 if os.path.isdir(name): 884 if os.path.isdir(name):
885 args.append('--recursive') 885 args.append('--recursive')
886 args.append(name) 886 args.append(name)
933 return 933 return
934 934
935 reposRoot = rx_base.cap(1) 935 reposRoot = rx_base.cap(1)
936 tn = tag 936 tn = tag
937 if tagType == 1: 937 if tagType == 1:
938 url = '%s/tags/%s' % (reposRoot, urllib.quote(tag)) 938 url = '%s/tags/%s' % (reposRoot, urllib.parse.quote(tag))
939 elif tagType == 2: 939 elif tagType == 2:
940 url = '%s/branches/%s' % (reposRoot, urllib.quote(tag)) 940 url = '%s/branches/%s' % (reposRoot, urllib.parse.quote(tag))
941 elif tagType == 4: 941 elif tagType == 4:
942 url = '%s/trunk' % (reposRoot) 942 url = '%s/trunk' % (reposRoot)
943 tn = 'HEAD' 943 tn = 'HEAD'
944 else: 944 else:
945 url = self.__svnURL(tag) 945 url = self.__svnURL(tag)
1059 if not os.path.isdir(os.path.join(dname, self.adminDir)): 1059 if not os.path.isdir(os.path.join(dname, self.adminDir)):
1060 # not under version control -> do nothing 1060 # not under version control -> do nothing
1061 return names 1061 return names
1062 1062
1063 found = False 1063 found = False
1064 for name in self.statusCache.keys(): 1064 for name in list(self.statusCache.keys()):
1065 if os.path.dirname(name) == dname: 1065 if os.path.dirname(name) == dname:
1066 if shortcut: 1066 if shortcut:
1067 found = True 1067 found = True
1068 break 1068 break
1069 if name in names: 1069 if name in names:
1082 procStarted = process.waitForStarted() 1082 procStarted = process.waitForStarted()
1083 if procStarted: 1083 if procStarted:
1084 finished = process.waitForFinished(30000) 1084 finished = process.waitForFinished(30000)
1085 if finished and process.exitCode() == 0: 1085 if finished and process.exitCode() == 0:
1086 output = \ 1086 output = \
1087 unicode(process.readAllStandardOutput(), ioEncoding, 'replace') 1087 str(process.readAllStandardOutput(), ioEncoding, 'replace')
1088 for line in output.splitlines(): 1088 for line in output.splitlines():
1089 if self.rx_status1.exactMatch(line): 1089 if self.rx_status1.exactMatch(line):
1090 flags = str(self.rx_status1.cap(1)) 1090 flags = str(self.rx_status1.cap(1))
1091 path = self.rx_status1.cap(5).strip() 1091 path = self.rx_status1.cap(5).strip()
1092 elif self.rx_status2.exactMatch(line): 1092 elif self.rx_status2.exactMatch(line):
1209 process.start('svn', args) 1209 process.start('svn', args)
1210 procStarted = process.waitForStarted() 1210 procStarted = process.waitForStarted()
1211 if procStarted: 1211 if procStarted:
1212 finished = process.waitForFinished(30000) 1212 finished = process.waitForFinished(30000)
1213 if finished and process.exitCode() == 0: 1213 if finished and process.exitCode() == 0:
1214 output = unicode(process.readAllStandardOutput(), ioEncoding, 'replace') 1214 output = str(process.readAllStandardOutput(), ioEncoding, 'replace')
1215 entryFound = False 1215 entryFound = False
1216 commitFound = False 1216 commitFound = False
1217 for line in output.splitlines(): 1217 for line in output.splitlines():
1218 line = line.strip() 1218 line = line.strip()
1219 if line.startswith('<entry'): 1219 if line.startswith('<entry'):
1283 process.start('svn', args) 1283 process.start('svn', args)
1284 procStarted = process.waitForStarted() 1284 procStarted = process.waitForStarted()
1285 if procStarted: 1285 if procStarted:
1286 finished = process.waitForFinished(30000) 1286 finished = process.waitForFinished(30000)
1287 if finished and process.exitCode() == 0: 1287 if finished and process.exitCode() == 0:
1288 output = unicode(process.readAllStandardOutput(), ioEncoding, 'replace') 1288 output = str(process.readAllStandardOutput(), ioEncoding, 'replace')
1289 for line in output.splitlines(): 1289 for line in output.splitlines():
1290 line = line.strip() 1290 line = line.strip()
1291 if line.startswith('<url>'): 1291 if line.startswith('<url>'):
1292 reposURL = line.replace('<url>', '').replace('</url>', '') 1292 reposURL = line.replace('<url>', '').replace('</url>', '')
1293 return reposURL 1293 return reposURL
1306 args.append('--accept') 1306 args.append('--accept')
1307 args.append('working') 1307 args.append('working')
1308 else: 1308 else:
1309 args.append('resolved') 1309 args.append('resolved')
1310 self.addArguments(args, self.options['global']) 1310 self.addArguments(args, self.options['global'])
1311 if type(name) is types.ListType: 1311 if isinstance(name, list):
1312 self.addArguments(args, name) 1312 self.addArguments(args, name)
1313 else: 1313 else:
1314 if os.path.isdir(name): 1314 if os.path.isdir(name):
1315 args.append('--recursive') 1315 args.append('--recursive')
1316 args.append(name) 1316 args.append(name)
1394 args.append('--recursive') 1394 args.append('--recursive')
1395 args.append(propName) 1395 args.append(propName)
1396 if fileFlag: 1396 if fileFlag:
1397 args.append('--file') 1397 args.append('--file')
1398 args.append(propValue) 1398 args.append(propValue)
1399 if type(name) is types.ListType: 1399 if isinstance(name, list):
1400 dname, fnames = self.splitPathList(name) 1400 dname, fnames = self.splitPathList(name)
1401 self.addArguments(args, fnames) 1401 self.addArguments(args, fnames)
1402 else: 1402 else:
1403 dname, fname = self.splitPath(name) 1403 dname, fname = self.splitPath(name)
1404 args.append(fname) 1404 args.append(fname)
1434 args.append('propdel') 1434 args.append('propdel')
1435 self.addArguments(args, self.options['global']) 1435 self.addArguments(args, self.options['global'])
1436 if recursive: 1436 if recursive:
1437 args.append('--recursive') 1437 args.append('--recursive')
1438 args.append(propName) 1438 args.append(propName)
1439 if type(name) is types.ListType: 1439 if isinstance(name, list):
1440 dname, fnames = self.splitPathList(name) 1440 dname, fnames = self.splitPathList(name)
1441 self.addArguments(args, fnames) 1441 self.addArguments(args, fnames)
1442 else: 1442 else:
1443 dname, fname = self.splitPath(name) 1443 dname, fname = self.splitPath(name)
1444 args.append(fname) 1444 args.append(fname)
1498 1498
1499 This method gives the chance to enter the revisions to be compared. 1499 This method gives the chance to enter the revisions to be compared.
1500 1500
1501 @param name file/directory name to be diffed (string) 1501 @param name file/directory name to be diffed (string)
1502 """ 1502 """
1503 if type(name) is types.ListType: 1503 if isinstance(name, list):
1504 names = name[:] 1504 names = name[:]
1505 else: 1505 else:
1506 names = [name] 1506 names = [name]
1507 for nam in names: 1507 for nam in names:
1508 if os.path.isfile(nam): 1508 if os.path.isfile(nam):
1531 1531
1532 This method gives the chance to enter the revisions to be compared. 1532 This method gives the chance to enter the revisions to be compared.
1533 1533
1534 @param name file/directory name to be diffed (string) 1534 @param name file/directory name to be diffed (string)
1535 """ 1535 """
1536 if type(name) is types.ListType: 1536 if isinstance(name, list):
1537 names = name[:] 1537 names = name[:]
1538 else: 1538 else:
1539 names = [name] 1539 names = [name]
1540 for nam in names: 1540 for nam in names:
1541 if os.path.isfile(nam): 1541 if os.path.isfile(nam):
1596 args = [] 1596 args = []
1597 args.append('lock') 1597 args.append('lock')
1598 self.addArguments(args, self.options['global']) 1598 self.addArguments(args, self.options['global'])
1599 if stealIt: 1599 if stealIt:
1600 args.append('--force') 1600 args.append('--force')
1601 if type(name) is types.ListType: 1601 if isinstance(name, list):
1602 dname, fnames = self.splitPathList(name) 1602 dname, fnames = self.splitPathList(name)
1603 self.addArguments(args, fnames) 1603 self.addArguments(args, fnames)
1604 else: 1604 else:
1605 dname, fname = self.splitPath(name) 1605 dname, fname = self.splitPath(name)
1606 args.append(fname) 1606 args.append(fname)
1621 args = [] 1621 args = []
1622 args.append('unlock') 1622 args.append('unlock')
1623 self.addArguments(args, self.options['global']) 1623 self.addArguments(args, self.options['global'])
1624 if breakIt: 1624 if breakIt:
1625 args.append('--force') 1625 args.append('--force')
1626 if type(name) is types.ListType: 1626 if isinstance(name, list):
1627 dname, fnames = self.splitPathList(name) 1627 dname, fnames = self.splitPathList(name)
1628 self.addArguments(args, fnames) 1628 self.addArguments(args, fnames)
1629 else: 1629 else:
1630 dname, fname = self.splitPath(name) 1630 dname, fname = self.splitPath(name)
1631 args.append(fname) 1631 args.append(fname)
1694 args = [] 1694 args = []
1695 args.append('changelist') 1695 args.append('changelist')
1696 self.addArguments(args, self.options['global']) 1696 self.addArguments(args, self.options['global'])
1697 args.append('--remove') 1697 args.append('--remove')
1698 args.append('--recursive') 1698 args.append('--recursive')
1699 if type(names) is types.ListType: 1699 if isinstance(names, list):
1700 dname, fnames = self.splitPathList(names) 1700 dname, fnames = self.splitPathList(names)
1701 self.addArguments(args, fnames) 1701 self.addArguments(args, fnames)
1702 else: 1702 else:
1703 dname, fname = self.splitPath(names) 1703 dname, fname = self.splitPath(names)
1704 args.append(fname) 1704 args.append(fname)
1728 args = [] 1728 args = []
1729 args.append('changelist') 1729 args.append('changelist')
1730 self.addArguments(args, self.options['global']) 1730 self.addArguments(args, self.options['global'])
1731 args.append('--recursive') 1731 args.append('--recursive')
1732 args.append(clname) 1732 args.append(clname)
1733 if type(names) is types.ListType: 1733 if isinstance(names, list):
1734 dname, fnames = self.splitPathList(names) 1734 dname, fnames = self.splitPathList(names)
1735 self.addArguments(args, fnames) 1735 self.addArguments(args, fnames)
1736 else: 1736 else:
1737 dname, fname = self.splitPath(names) 1737 dname, fname = self.splitPath(names)
1738 args.append(fname) 1738 args.append(fname)
1757 url = url.split(':', 2) 1757 url = url.split(':', 2)
1758 if len(url) == 3: 1758 if len(url) == 3:
1759 scheme = url[0] 1759 scheme = url[0]
1760 host = url[1] 1760 host = url[1]
1761 port, path = url[2].split("/",1) 1761 port, path = url[2].split("/",1)
1762 return "%s:%s:%s/%s" % (scheme, host, port, urllib.quote(path)) 1762 return "%s:%s:%s/%s" % (scheme, host, port, urllib.parse.quote(path))
1763 else: 1763 else:
1764 scheme = url[0] 1764 scheme = url[0]
1765 if scheme == "file": 1765 if scheme == "file":
1766 return "%s:%s" % (scheme, urllib.quote(url[1])) 1766 return "%s:%s" % (scheme, urllib.parse.quote(url[1]))
1767 else: 1767 else:
1768 host, path = url[1][2:].split("/",1) 1768 host, path = url[1][2:].split("/",1)
1769 return "%s://%s/%s" % (scheme, host, urllib.quote(path)) 1769 return "%s://%s/%s" % (scheme, host, urllib.parse.quote(path))
1770 1770
1771 def svnNormalizeURL(self, url): 1771 def svnNormalizeURL(self, url):
1772 """ 1772 """
1773 Public method to normalize a url for subversion. 1773 Public method to normalize a url for subversion.
1774 1774

eric ide

mercurial