Here’s a simple little script which allows me to use p4.exe from cygwin. Perforce actually releases a p4.exe for cygwin, but I wanted my p4win and p4.exe to be able to use the same client spec. This isn’t possible when one requires a root starting with “C:\” and the other requires “/cygdrive/c/”.
This script works by expanding and window-izing all arguments after the p4 command.
Here is a series which shows the transformation.
- p4 edit README
- p4 edit /home/gwarner/foo/README (where foo is a symbolic link)
- p4 edit /cygdrive/c/perforceRoot/blah/blah/blah/README
- p4 edit C:\perforceRoot\blah\blah\blah\README
Ta da!
1. #!/usr/bin/python
2. import sys
3. from subprocess import *
4.
5. def win32Path(path): path = path.replace('/cygdrive/c/','C:\\')
6. path = path.replace('/','\\')
7. return '"%s"' % path.strip()
8. if __name__ == '__main__':
9. p4command = sys.argv[1]
10. fullFiles = []
11.
12. for file in sys.argv[2:]:
13. fullPath = Popen(['readlink.exe -f ' + file], stdout=PIPE, shell=True).communicate()[0]
14. fullFiles.append(win32Path(fullPath))
15.
16. newCommand = 'p4 %s %s' % (p4command, ' '.join(fullFiles))
17.
18. print newCommand
19. check_call(newCommand, shell=True)
20. print 'done.'