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): |
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, |
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) |
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) |
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) |
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 |