25
25
import zipfile
26
26
import zlib
27
27
import ctypes
28
+ import errno
28
29
29
30
try :
30
31
from subprocess import CalledProcessError
@@ -1543,7 +1544,7 @@ def edit_template(self, template_file):
1543
1544
if response == 'n' :
1544
1545
return False
1545
1546
1546
- def get_diff_description (self , editedFiles , filesToAdd ):
1547
+ def get_diff_description (self , editedFiles , filesToAdd , symlinks ):
1547
1548
# diff
1548
1549
if os .environ .has_key ("P4DIFF" ):
1549
1550
del (os .environ ["P4DIFF" ])
@@ -1558,10 +1559,17 @@ def get_diff_description(self, editedFiles, filesToAdd):
1558
1559
newdiff += "==== new file ====\n "
1559
1560
newdiff += "--- /dev/null\n "
1560
1561
newdiff += "+++ %s\n " % newFile
1561
- f = open (newFile , "r" )
1562
- for line in f .readlines ():
1563
- newdiff += "+" + line
1564
- f .close ()
1562
+
1563
+ is_link = os .path .islink (newFile )
1564
+ expect_link = newFile in symlinks
1565
+
1566
+ if is_link and expect_link :
1567
+ newdiff += "+%s\n " % os .readlink (newFile )
1568
+ else :
1569
+ f = open (newFile , "r" )
1570
+ for line in f .readlines ():
1571
+ newdiff += "+" + line
1572
+ f .close ()
1565
1573
1566
1574
return (diff + newdiff ).replace ('\r \n ' , '\n ' )
1567
1575
@@ -1579,6 +1587,7 @@ def applyCommit(self, id):
1579
1587
filesToDelete = set ()
1580
1588
editedFiles = set ()
1581
1589
pureRenameCopy = set ()
1590
+ symlinks = set ()
1582
1591
filesToChangeExecBit = {}
1583
1592
1584
1593
for line in diff :
@@ -1595,6 +1604,11 @@ def applyCommit(self, id):
1595
1604
filesToChangeExecBit [path ] = diff ['dst_mode' ]
1596
1605
if path in filesToDelete :
1597
1606
filesToDelete .remove (path )
1607
+
1608
+ dst_mode = int (diff ['dst_mode' ], 8 )
1609
+ if dst_mode == 0120000 :
1610
+ symlinks .add (path )
1611
+
1598
1612
elif modifier == "D" :
1599
1613
filesToDelete .add (path )
1600
1614
if path in filesToAdd :
@@ -1732,7 +1746,7 @@ def applyCommit(self, id):
1732
1746
separatorLine = "######## everything below this line is just the diff #######\n "
1733
1747
if not self .prepare_p4_only :
1734
1748
submitTemplate += separatorLine
1735
- submitTemplate += self .get_diff_description (editedFiles , filesToAdd )
1749
+ submitTemplate += self .get_diff_description (editedFiles , filesToAdd , symlinks )
1736
1750
1737
1751
(handle , fileName ) = tempfile .mkstemp ()
1738
1752
tmpFile = os .fdopen (handle , "w+b" )
0 commit comments