2525import zipfile
2626import zlib
2727import ctypes
28+ import errno
2829
2930try :
3031 from subprocess import CalledProcessError
@@ -1543,7 +1544,7 @@ def edit_template(self, template_file):
15431544 if response == 'n' :
15441545 return False
15451546
1546- def get_diff_description (self , editedFiles , filesToAdd ):
1547+ def get_diff_description (self , editedFiles , filesToAdd , symlinks ):
15471548 # diff
15481549 if os .environ .has_key ("P4DIFF" ):
15491550 del (os .environ ["P4DIFF" ])
@@ -1558,10 +1559,17 @@ def get_diff_description(self, editedFiles, filesToAdd):
15581559 newdiff += "==== new file ====\n "
15591560 newdiff += "--- /dev/null\n "
15601561 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 ()
15651573
15661574 return (diff + newdiff ).replace ('\r \n ' , '\n ' )
15671575
@@ -1579,6 +1587,7 @@ def applyCommit(self, id):
15791587 filesToDelete = set ()
15801588 editedFiles = set ()
15811589 pureRenameCopy = set ()
1590+ symlinks = set ()
15821591 filesToChangeExecBit = {}
15831592
15841593 for line in diff :
@@ -1595,6 +1604,11 @@ def applyCommit(self, id):
15951604 filesToChangeExecBit [path ] = diff ['dst_mode' ]
15961605 if path in filesToDelete :
15971606 filesToDelete .remove (path )
1607+
1608+ dst_mode = int (diff ['dst_mode' ], 8 )
1609+ if dst_mode == 0120000 :
1610+ symlinks .add (path )
1611+
15981612 elif modifier == "D" :
15991613 filesToDelete .add (path )
16001614 if path in filesToAdd :
@@ -1732,7 +1746,7 @@ def applyCommit(self, id):
17321746 separatorLine = "######## everything below this line is just the diff #######\n "
17331747 if not self .prepare_p4_only :
17341748 submitTemplate += separatorLine
1735- submitTemplate += self .get_diff_description (editedFiles , filesToAdd )
1749+ submitTemplate += self .get_diff_description (editedFiles , filesToAdd , symlinks )
17361750
17371751 (handle , fileName ) = tempfile .mkstemp ()
17381752 tmpFile = os .fdopen (handle , "w+b" )
0 commit comments