# HG changeset patch # User Frank Kingswood # Date 2009-06-18 09:39:04 # Node ID ce4b92f5cea7871ee2135c19843a6fc7af3d6136 # Parent 49273e1078183bc1c54dc5f554a7fd04c084b7f7 convert: Make P4 conversion cope with keywords, binary files and symbolic links. Convert now handles errors from p4 during conversion more gracefully. If keyword expansion is enabled in a P4 file then keywords will be unexpanded in hg. Added testcase for p4 filetypes and keyword (un)expansion. This testcase ignores UTF and Apple files to avoid binary data. Edited by pmezard: fixed collation issue on OSX diff --git a/hgext/convert/p4.py b/hgext/convert/p4.py --- a/hgext/convert/p4.py +++ b/hgext/convert/p4.py @@ -12,6 +12,7 @@ from mercurial.i18n import _ from common import commit, converter_source, checktool, NoRepo import marshal +import re def loaditer(f): "Yield the dictionary objects generated by p4" @@ -28,7 +29,7 @@ class p4_source(converter_source): def __init__(self, ui, path, rev=None): super(p4_source, self).__init__(ui, path, rev=rev) - if not path.startswith('//'): + if "/" in path and not path.startswith('//'): raise NoRepo('%s does not look like a P4 repo' % path) checktool('p4', abort=False) @@ -43,6 +44,9 @@ class p4_source(converter_source): self.encoding = "latin_1" self.depotname = {} # mapping from local name to depot name self.modecache = {} + self.re_type = re.compile("([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)(\+\w+)?$") + self.re_keywords = re.compile(r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author):[^$\n]*\$") + self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$") self._parse(ui, path) @@ -146,22 +150,44 @@ class p4_source(converter_source): stdout = util.popen(cmd) mode = None - data = "" + contents = "" + keywords = None for d in loaditer(stdout): - if d["code"] == "stat": - if "+x" in d["type"]: - mode = "x" - else: + code = d["code"] + data = d.get("data") + + if code == "error": + raise IOError(d["generic"], data) + + elif code == "stat": + p4type = self.re_type.match(d["type"]) + if p4type: mode = "" - elif d["code"] == "text": - data += d["data"] + flags = (p4type.group(1) or "") + (p4type.group(3) or "") + if "x" in flags: + mode = "x" + if p4type.group(2) == "symlink": + mode = "l" + if "ko" in flags: + keywords = self.re_keywords_old + elif "k" in flags: + keywords = self.re_keywords + + elif code == "text" or code == "binary": + contents += data if mode is None: - raise IOError() + raise IOError(0, "bad stat") self.modecache[(name, rev)] = mode - return data + + if keywords: + contents = keywords.sub("$\\1$", contents) + if mode == "l" and contents.endswith("\n"): + contents = contents[:-1] + + return contents def getmode(self, name, rev): return self.modecache[(name, rev)] diff --git a/tests/test-convert-p4-filetypes b/tests/test-convert-p4-filetypes new file mode 100755 --- /dev/null +++ b/tests/test-convert-p4-filetypes @@ -0,0 +1,104 @@ +#!/bin/sh + +"$TESTDIR/hghave" p4 execbit symlink || exit 80 + +echo "[extensions]" >> $HGRCPATH +echo "convert = " >> $HGRCPATH + +echo % create p4 depot +export P4ROOT=$PWD/depot +export P4AUDIT=$P4ROOT/audit +export P4JOURNAL=$P4ROOT/journal +export P4LOG=$P4ROOT/log +export P4PORT=localhost:16661 +export P4DEBUG=1 +export P4CHARSET=utf8 + +echo % start the p4 server +[ ! -d $P4ROOT ] && mkdir $P4ROOT +p4d -f -J off -xi >$P4ROOT/stdout 2>$P4ROOT/stderr +p4d -f -J off >$P4ROOT/stdout 2>$P4ROOT/stderr & +trap "echo % stop the p4 server ; p4 admin stop" EXIT + +# wait for the server to initialize +while ! p4 ; do + sleep 1 +done >/dev/null 2>/dev/null + +echo % create a client spec +export P4CLIENT=hg-p4-import +DEPOTPATH=//depot/test-mercurial-import/... +p4 client -o | sed '/^View:/,$ d' >p4client +echo View: >>p4client +echo " $DEPOTPATH //$P4CLIENT/..." >>p4client +p4 client -i target_$T2 + ln -s target_$T file_$T2 + p4 add target_$T2 + p4 add -t $T file_$T2 + ;; + binary*) + python -c "file('file_$T2', 'wb').write('this is $T')" + p4 add -t $T file_$T2 + ;; + *) + echo "this is $T" >file_$T2 + p4 add -t $T file_$T2 + ;; + esac +done +p4 submit -d initial + +echo % test keyword expansion +p4 edit file_* target_* +for T in $TYPES ; do + T2=`echo $T | tr [:upper:] [:lower:]` + echo '$Id$' >>file_$T2 + echo '$Header$' >>file_$T2 + echo '$Date$' >>file_$T2 + echo '$DateTime$' >>file_$T2 + echo '$Change$' >>file_$T2 + echo '$File$' >>file_$T2 + echo '$Revision$' >>file_$T2 + echo '$Header$$Header$Header$' >>file_$T2 +done + +ln -s 'target_$Header$' crazy_symlink+k +p4 add -t symlink+k crazy_symlink+k + +p4 submit -d keywords + +echo % check keywords in p4 +grep -H Header file_* + +echo % convert +hg convert -s p4 $DEPOTPATH dst +hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'g + +echo % revision 0 +hg -R dst update 0 +head dst/file_* | cat -v + +echo +echo % revision 1 +hg -R dst update 1 +head dst/file_* | cat -v +echo +echo % crazy_symlink +readlink crazy_symlink+k +readlink dst/crazy_symlink+k + diff --git a/tests/test-convert-p4-filetypes.out b/tests/test-convert-p4-filetypes.out new file mode 100644 --- /dev/null +++ b/tests/test-convert-p4-filetypes.out @@ -0,0 +1,642 @@ +% create p4 depot +% start the p4 server +% create a client spec +Client hg-p4-import saved. +% populate the depot +//depot/test-mercurial-import/file_text#1 - opened for add +//depot/test-mercurial-import/file_binary#1 - opened for add +//depot/test-mercurial-import/target_symlink#1 - opened for add +//depot/test-mercurial-import/file_symlink#1 - opened for add +//depot/test-mercurial-import/file_text+m#1 - opened for add +//depot/test-mercurial-import/file_text+w#1 - opened for add +//depot/test-mercurial-import/file_text+x#1 - opened for add +//depot/test-mercurial-import/file_text+k#1 - opened for add +//depot/test-mercurial-import/file_text+kx#1 - opened for add +//depot/test-mercurial-import/file_text+ko#1 - opened for add +//depot/test-mercurial-import/file_text+l#1 - opened for add +//depot/test-mercurial-import/file_text+c#1 - opened for add +//depot/test-mercurial-import/file_text+d#1 - opened for add +//depot/test-mercurial-import/file_text+f#1 - opened for add +//depot/test-mercurial-import/file_text+s#1 - opened for add +//depot/test-mercurial-import/file_text+s2#1 - opened for add +//depot/test-mercurial-import/file_binary+k#1 - opened for add +//depot/test-mercurial-import/file_binary+x#1 - opened for add +//depot/test-mercurial-import/file_binary+kx#1 - opened for add +//depot/test-mercurial-import/target_symlink+k#1 - opened for add +//depot/test-mercurial-import/file_symlink+k#1 - opened for add +//depot/test-mercurial-import/file_ctext#1 - opened for add +//depot/test-mercurial-import/file_cxtext#1 - opened for add +//depot/test-mercurial-import/file_ktext#1 - opened for add +//depot/test-mercurial-import/file_kxtext#1 - opened for add +//depot/test-mercurial-import/file_ltext#1 - opened for add +//depot/test-mercurial-import/file_tempobj#1 - opened for add +//depot/test-mercurial-import/file_ubinary#1 - opened for add +//depot/test-mercurial-import/file_uxbinary#1 - opened for add +//depot/test-mercurial-import/file_xbinary#1 - opened for add +//depot/test-mercurial-import/file_xltext#1 - opened for add +//depot/test-mercurial-import/file_xtempobj#1 - opened for add +//depot/test-mercurial-import/file_xtext#1 - opened for add +Submitting change 1. +Locking 33 files ... +add //depot/test-mercurial-import/file_binary#1 +add //depot/test-mercurial-import/file_binary+k#1 +add //depot/test-mercurial-import/file_binary+kx#1 +add //depot/test-mercurial-import/file_binary+x#1 +add //depot/test-mercurial-import/file_ctext#1 +add //depot/test-mercurial-import/file_cxtext#1 +add //depot/test-mercurial-import/file_ktext#1 +add //depot/test-mercurial-import/file_kxtext#1 +add //depot/test-mercurial-import/file_ltext#1 +add //depot/test-mercurial-import/file_symlink#1 +add //depot/test-mercurial-import/file_symlink+k#1 +add //depot/test-mercurial-import/file_tempobj#1 +add //depot/test-mercurial-import/file_text#1 +add //depot/test-mercurial-import/file_text+c#1 +add //depot/test-mercurial-import/file_text+d#1 +add //depot/test-mercurial-import/file_text+f#1 +add //depot/test-mercurial-import/file_text+k#1 +add //depot/test-mercurial-import/file_text+ko#1 +add //depot/test-mercurial-import/file_text+kx#1 +add //depot/test-mercurial-import/file_text+l#1 +add //depot/test-mercurial-import/file_text+m#1 +add //depot/test-mercurial-import/file_text+s#1 +add //depot/test-mercurial-import/file_text+s2#1 +add //depot/test-mercurial-import/file_text+w#1 +add //depot/test-mercurial-import/file_text+x#1 +add //depot/test-mercurial-import/file_ubinary#1 +add //depot/test-mercurial-import/file_uxbinary#1 +add //depot/test-mercurial-import/file_xbinary#1 +add //depot/test-mercurial-import/file_xltext#1 +add //depot/test-mercurial-import/file_xtempobj#1 +add //depot/test-mercurial-import/file_xtext#1 +add //depot/test-mercurial-import/target_symlink#1 +add //depot/test-mercurial-import/target_symlink+k#1 +Change 1 submitted. +//depot/test-mercurial-import/file_binary+k#1 - refreshing +//depot/test-mercurial-import/file_binary+kx#1 - refreshing +//depot/test-mercurial-import/file_ktext#1 - refreshing +//depot/test-mercurial-import/file_kxtext#1 - refreshing +//depot/test-mercurial-import/file_symlink+k#1 - refreshing +//depot/test-mercurial-import/file_text+k#1 - refreshing +//depot/test-mercurial-import/file_text+ko#1 - refreshing +//depot/test-mercurial-import/file_text+kx#1 - refreshing +% test keyword expansion +//depot/test-mercurial-import/file_binary#1 - opened for edit +//depot/test-mercurial-import/file_binary+k#1 - opened for edit +//depot/test-mercurial-import/file_binary+kx#1 - opened for edit +//depot/test-mercurial-import/file_binary+x#1 - opened for edit +//depot/test-mercurial-import/file_ctext#1 - opened for edit +//depot/test-mercurial-import/file_cxtext#1 - opened for edit +//depot/test-mercurial-import/file_ktext#1 - opened for edit +//depot/test-mercurial-import/file_kxtext#1 - opened for edit +//depot/test-mercurial-import/file_ltext#1 - opened for edit +//depot/test-mercurial-import/file_symlink#1 - opened for edit +//depot/test-mercurial-import/file_symlink+k#1 - opened for edit +//depot/test-mercurial-import/file_tempobj#1 - opened for edit +//depot/test-mercurial-import/file_text#1 - opened for edit +//depot/test-mercurial-import/file_text+c#1 - opened for edit +//depot/test-mercurial-import/file_text+d#1 - opened for edit +//depot/test-mercurial-import/file_text+f#1 - opened for edit +//depot/test-mercurial-import/file_text+k#1 - opened for edit +//depot/test-mercurial-import/file_text+ko#1 - opened for edit +//depot/test-mercurial-import/file_text+kx#1 - opened for edit +//depot/test-mercurial-import/file_text+l#1 - opened for edit +//depot/test-mercurial-import/file_text+m#1 - opened for edit +//depot/test-mercurial-import/file_text+s#1 - opened for edit +//depot/test-mercurial-import/file_text+s2#1 - opened for edit +//depot/test-mercurial-import/file_text+w#1 - opened for edit +//depot/test-mercurial-import/file_text+x#1 - opened for edit +//depot/test-mercurial-import/file_ubinary#1 - opened for edit +//depot/test-mercurial-import/file_uxbinary#1 - opened for edit +//depot/test-mercurial-import/file_xbinary#1 - opened for edit +//depot/test-mercurial-import/file_xltext#1 - opened for edit +//depot/test-mercurial-import/file_xtempobj#1 - opened for edit +//depot/test-mercurial-import/file_xtext#1 - opened for edit +//depot/test-mercurial-import/target_symlink#1 - opened for edit +//depot/test-mercurial-import/target_symlink+k#1 - opened for edit +//depot/test-mercurial-import/crazy_symlink+k#1 - opened for add +Submitting change 2. +Locking 34 files ... +add //depot/test-mercurial-import/crazy_symlink+k#1 +edit //depot/test-mercurial-import/file_binary#2 +edit //depot/test-mercurial-import/file_binary+k#2 +edit //depot/test-mercurial-import/file_binary+kx#2 +edit //depot/test-mercurial-import/file_binary+x#2 +edit //depot/test-mercurial-import/file_ctext#2 +edit //depot/test-mercurial-import/file_cxtext#2 +edit //depot/test-mercurial-import/file_ktext#2 +edit //depot/test-mercurial-import/file_kxtext#2 +edit //depot/test-mercurial-import/file_ltext#2 +edit //depot/test-mercurial-import/file_symlink#2 +edit //depot/test-mercurial-import/file_symlink+k#2 +edit //depot/test-mercurial-import/file_tempobj#2 +edit //depot/test-mercurial-import/file_text#2 +edit //depot/test-mercurial-import/file_text+c#2 +edit //depot/test-mercurial-import/file_text+d#2 +edit //depot/test-mercurial-import/file_text+f#2 +edit //depot/test-mercurial-import/file_text+k#2 +edit //depot/test-mercurial-import/file_text+ko#2 +edit //depot/test-mercurial-import/file_text+kx#2 +edit //depot/test-mercurial-import/file_text+l#2 +edit //depot/test-mercurial-import/file_text+m#2 +edit //depot/test-mercurial-import/file_text+s#2 +edit //depot/test-mercurial-import/file_text+s2#2 +edit //depot/test-mercurial-import/file_text+w#2 +edit //depot/test-mercurial-import/file_text+x#2 +edit //depot/test-mercurial-import/file_ubinary#2 +edit //depot/test-mercurial-import/file_uxbinary#2 +edit //depot/test-mercurial-import/file_xbinary#2 +edit //depot/test-mercurial-import/file_xltext#2 +edit //depot/test-mercurial-import/file_xtempobj#2 +edit //depot/test-mercurial-import/file_xtext#2 +edit //depot/test-mercurial-import/target_symlink#2 +edit //depot/test-mercurial-import/target_symlink+k#2 +Change 2 submitted. +//depot/test-mercurial-import/crazy_symlink+k#1 - refreshing +//depot/test-mercurial-import/file_binary+k#2 - refreshing +//depot/test-mercurial-import/file_binary+kx#2 - refreshing +//depot/test-mercurial-import/file_ktext#2 - refreshing +//depot/test-mercurial-import/file_kxtext#2 - refreshing +//depot/test-mercurial-import/file_symlink+k#2 - refreshing +//depot/test-mercurial-import/file_text+k#2 - refreshing +//depot/test-mercurial-import/file_text+ko#2 - refreshing +//depot/test-mercurial-import/file_text+kx#2 - refreshing +% check keywords in p4 +file_binary:$Header$ +file_binary:$Header$$Header$Header$ +file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $ +file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $$Header: //depot/test-mercurial-import/file_binary+k#2 $Header$ +file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $ +file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $$Header: //depot/test-mercurial-import/file_binary+kx#2 $Header$ +file_binary+x:$Header$ +file_binary+x:$Header$$Header$Header$ +file_ctext:$Header$ +file_ctext:$Header$$Header$Header$ +file_cxtext:$Header$ +file_cxtext:$Header$$Header$Header$ +file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $ +file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $$Header: //depot/test-mercurial-import/file_ktext#2 $Header$ +file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $ +file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $$Header: //depot/test-mercurial-import/file_kxtext#2 $Header$ +file_ltext:$Header$ +file_ltext:$Header$$Header$Header$ +file_symlink:$Header$ +file_symlink:$Header$$Header$Header$ +file_symlink+k:$Header$ +file_symlink+k:$Header$$Header$Header$ +file_tempobj:$Header$ +file_tempobj:$Header$$Header$Header$ +file_text:$Header$ +file_text:$Header$$Header$Header$ +file_text+c:$Header$ +file_text+c:$Header$$Header$Header$ +file_text+d:$Header$ +file_text+d:$Header$$Header$Header$ +file_text+f:$Header$ +file_text+f:$Header$$Header$Header$ +file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $ +file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $$Header: //depot/test-mercurial-import/file_text+k#2 $Header$ +file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $ +file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $$Header: //depot/test-mercurial-import/file_text+ko#2 $Header$ +file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $ +file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $$Header: //depot/test-mercurial-import/file_text+kx#2 $Header$ +file_text+l:$Header$ +file_text+l:$Header$$Header$Header$ +file_text+m:$Header$ +file_text+m:$Header$$Header$Header$ +file_text+s:$Header$ +file_text+s:$Header$$Header$Header$ +file_text+s2:$Header$ +file_text+s2:$Header$$Header$Header$ +file_text+w:$Header$ +file_text+w:$Header$$Header$Header$ +file_text+x:$Header$ +file_text+x:$Header$$Header$Header$ +file_ubinary:$Header$ +file_ubinary:$Header$$Header$Header$ +file_uxbinary:$Header$ +file_uxbinary:$Header$$Header$Header$ +file_xbinary:$Header$ +file_xbinary:$Header$$Header$Header$ +file_xltext:$Header$ +file_xltext:$Header$$Header$Header$ +file_xtempobj:$Header$ +file_xtempobj:$Header$$Header$Header$ +file_xtext:$Header$ +file_xtext:$Header$$Header$Header$ +% convert +initializing destination dst repository +reading p4 views +collecting p4 changelists +1 initial +2 keywords +scanning source... +sorting... +converting... +1 initial +0 keywords +rev=1 desc="keywords" tags="tip" files="crazy_symlink+k file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k" +grev=0 desc="initial" tags="" files="file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_symlink file_symlink+k file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k" +g% revision 0 +30 files updated, 0 files merged, 0 files removed, 0 files unresolved +==> dst/file_binary <== +this is binary +==> dst/file_binary+k <== +this is binary+k +==> dst/file_binary+kx <== +this is binary+kx +==> dst/file_binary+x <== +this is binary+x +==> dst/file_ctext <== +this is ctext + +==> dst/file_cxtext <== +this is cxtext + +==> dst/file_ktext <== +this is ktext + +==> dst/file_kxtext <== +this is kxtext + +==> dst/file_ltext <== +this is ltext + +==> dst/file_symlink <== +this is target symlink + +==> dst/file_symlink+k <== +this is target symlink+k + +==> dst/file_text <== +this is text + +==> dst/file_text+c <== +this is text+C + +==> dst/file_text+d <== +this is text+D + +==> dst/file_text+f <== +this is text+F + +==> dst/file_text+k <== +this is text+k + +==> dst/file_text+ko <== +this is text+ko + +==> dst/file_text+kx <== +this is text+kx + +==> dst/file_text+l <== +this is text+l + +==> dst/file_text+m <== +this is text+m + +==> dst/file_text+s2 <== +this is text+S2 + +==> dst/file_text+w <== +this is text+w + +==> dst/file_text+x <== +this is text+x + +==> dst/file_ubinary <== +this is ubinary + +==> dst/file_uxbinary <== +this is uxbinary + +==> dst/file_xbinary <== +this is xbinary + +==> dst/file_xltext <== +this is xltext + +==> dst/file_xtext <== +this is xtext + +% revision 1 +30 files updated, 0 files merged, 0 files removed, 0 files unresolved +==> dst/file_binary <== +this is binary$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_binary+k <== +this is binary+k$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_binary+kx <== +this is binary+kx$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_binary+x <== +this is binary+x$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_ctext <== +this is ctext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_cxtext <== +this is cxtext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_ktext <== +this is ktext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_kxtext <== +this is kxtext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_ltext <== +this is ltext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_symlink <== +this is target symlink +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_symlink+k <== +this is target symlink+k +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text <== +this is text +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+c <== +this is text+C +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+d <== +this is text+D +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+f <== +this is text+F +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+k <== +this is text+k +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+ko <== +this is text+ko +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+kx <== +this is text+kx +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+l <== +this is text+l +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+m <== +this is text+m +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+s <== +this is text+S +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+s2 <== +this is text+S2 +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+w <== +this is text+w +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_text+x <== +this is text+x +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_ubinary <== +this is ubinary +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_uxbinary <== +this is uxbinary +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_xbinary <== +this is xbinary +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_xltext <== +this is xltext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +==> dst/file_xtext <== +this is xtext +$Id$ +$Header$ +$Date$ +$DateTime$ +$Change$ +$File$ +$Revision$ +$Header$$Header$Header$ + +% crazy_symlink +target_$Header: //depot/test-mercurial-import/crazy_symlink+k#1 $ +target_$Header$ +% stop the p4 server