diff --git a/tests/test-keyword b/tests/test-keyword new file mode 100755 --- /dev/null +++ b/tests/test-keyword @@ -0,0 +1,229 @@ +#!/bin/sh + +cat <> $HGRCPATH +[extensions] +hgext.keyword = +[keyword] +* = +b = ignore +[hooks] +commit= +commit.test=cp a hooktest +EOF + +echo % help +hg help keyword + +echo % hg kwdemo +hg --quiet kwdemo --default \ +| sed -e 's![^ ][^ ]*demo.txt,v!/TMP/demo.txt,v!' \ + -e 's/,v [a-z0-9][a-z0-9]* /,v xxxxxxxxxxxx /' \ + -e '/[$]Revision/ s/: [a-z0-9][a-z0-9]* /: xxxxxxxxxxxx /' \ + -e 's! 20[0-9][0-9]/[01][0-9]/[0-3][0-9] [0-2][0-9]:[0-6][0-9]:[0-6][0-9]! 2000/00/00 00:00:00!' + +hg --quiet kwdemo "Branch = {branches}" + +hg init Test +cd Test + +echo % kwshrink should exit silently in empty/invalid repo +hg kwshrink + +echo 'expand $Id$' > a +echo 'do not process $Id:' >> a +echo 'xxx $' >> a +echo 'ignore $Id$' > b +ln -s a sym +echo % cat +cat sym a b + +echo % addremove +hg addremove +echo % status +hg status + +echo % default keyword expansion including commit hook +echo % interrupted commit should not change state or run commit hook +HGEDITOR=false hg --debug commit +echo % status +hg status + +echo % commit +hg --debug commit -mabsym -d '0 0' -u 'User Name ' +echo % status +hg status +echo % identify +hg --quiet identify +echo % cat +cat sym a b +echo % hg cat +hg cat sym a b + +echo +echo % diff a hooktest +diff a hooktest + +echo % removing commit hook from config +sed -e '/\[hooks\]/,$ d' $HGRCPATH > $HGRCPATH.nohook +mv $HGRCPATH.nohook $HGRCPATH +rm hooktest + +echo % touch +touch a b +echo % status +hg status + +rm sym a b +echo % update +hg update +echo % cat +cat sym a b + +echo % copy +hg cp a c + +echo % kwfiles added +hg kwfiles + +echo % commit +hg --debug commit -ma2c -d '1 0' -u 'User Name ' +echo % cat a c +cat a c +echo % touch copied c after 1 second +sleep 1 +touch c +echo % status +hg status + +echo % kwfiles +hg kwfiles + +echo % diff --rev +hg diff --rev 0 | grep -v 'b/c' + +echo % rollback +hg rollback +echo % status +hg status +echo % update -C +hg update --clean + +echo % custom keyword expansion +echo % try with kwdemo +hg --quiet kwdemo "Xinfo = {author}: {desc}" + +cat <>$HGRCPATH +[keywordmaps] +Id = {file} {node|short} {date|rfc822date} {author|user} +Xinfo = {author}: {desc} +EOF + +echo % cat +cat sym a b +echo % hg cat +hg cat sym a b + +echo +echo '$Xinfo$' >> a +cat <> log +firstline +secondline +EOF + +echo % interrupted commit should not change state +HGEDITOR=false hg commit +echo % status +hg status + +echo % commit +hg --debug commit -l log -d '2 0' -u 'User Name ' +rm log +echo % status +hg status + +echo % cat +cat sym a b +echo % hg cat +hg cat sym a b +echo + +echo % remove +hg remove a +hg --debug commit -m rma +echo % status +hg status +echo % rollback +hg rollback +echo % status +hg status +echo % revert a +hg revert --no-backup --rev tip a +echo % cat a +cat a + +echo % clone to test incoming +cd .. +hg clone -r0 Test Test-a +cd Test-a +cat <> .hg/hgrc +[paths] +default = ../Test +EOF +echo % incoming +# remove path to temp dir +hg incoming | sed -e 's/^\(comparing with \).*\(test-keyword.*\)/\1\2/' + +sed -i.bak -e 's/Id.*/& rejecttest/' a +rm a.bak +echo % commit rejecttest +hg --debug commit -m'rejects?' -d '3 0' -u 'User Name ' +echo % export +hg export -o ../rejecttest.diff tip + +cd ../Test +echo % import +hg import ../rejecttest.diff +echo % cat +cat sym a b +echo +echo % rollback +hg rollback +echo % clean update +hg update --clean + +echo % kwexpand/kwshrink on selected files +mkdir x +echo % copy a x/a +hg copy a x/a +echo % kwexpand a +hg --verbose kwexpand a +echo % kwexpand x/a should abort +hg --verbose kwexpand x/a +cd x +hg --debug commit -m xa -d '3 0' -u 'User Name ' +echo % cat a +cat a +echo % kwshrink a inside directory x +hg --verbose kwshrink a +echo % cat a +cat a +cd - > /dev/null 2>&1 + +echo % kwexpand nonexistent +hg kwexpand nonexistent + +echo % switch off expansion +echo % kwshrink with unknown file u +cp a u +hg --verbose kwshrink +echo % cat +cat sym a b +echo % hg cat +hg cat sym a b +echo +rm $HGRCPATH +echo % cat +cat sym a b +echo % hg cat +hg cat sym a b +echo diff --git a/tests/test-keyword.out b/tests/test-keyword.out new file mode 100644 --- /dev/null +++ b/tests/test-keyword.out @@ -0,0 +1,344 @@ +% help +keyword extension - keyword expansion in local repositories + +This extension expands RCS/CVS-like or self-customized $Keywords$ +in tracked text files selected by your configuration. + +Keywords are only expanded in local repositories and not stored in +the change history. The mechanism can be regarded as a convenience +for the current user or for archive distribution. + +Configuration is done in the [keyword] and [keywordmaps] sections +of hgrc files. + +Example: + + [keyword] + # expand keywords in every python file except those matching "x*" + **.py = + x* = ignore + +Note: the more specific you are in your filename patterns + the less you lose speed in huge repos. + +For [keywordmaps] template mapping and expansion demonstration and +control run "hg kwdemo". + +An additional date template filter {date|utcdate} is provided. + +The default template mappings (view with "hg kwdemo -d") can be replaced +with customized keywords and templates. +Again, run "hg kwdemo" to control the results of your config changes. + +Before changing/disabling active keywords, run "hg kwshrink" to avoid +the risk of inadvertedly storing expanded keywords in the change history. + +To force expansion after enabling it, or a configuration change, run +"hg kwexpand". + +Expansions spanning more than one line and incremental expansions, +like CVS' $Log$, are not supported. A keyword template map +"Log = {desc}" expands to the first line of the changeset description. + +list of commands: + + kwdemo print [keywordmaps] configuration and an expansion example + kwexpand expand keywords in working directory + kwfiles print files currently configured for keyword expansion + kwshrink revert expanded keywords in working directory + +use "hg -v help keyword" to show aliases and global options +% hg kwdemo +[extensions] +hgext.keyword = +[keyword] +* = +b = ignore +demo.txt = +[keywordmaps] +RCSFile = {file|basename},v +Author = {author|user} +Header = {root}/{file},v {node|short} {date|utcdate} {author|user} +Source = {root}/{file},v +Date = {date|utcdate} +Id = {file|basename},v {node|short} {date|utcdate} {author|user} +Revision = {node|short} +$RCSFile: demo.txt,v $ +$Author: test $ +$Header: /TMP/demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $ +$Source: /TMP/demo.txt,v $ +$Date: 2000/00/00 00:00:00 $ +$Id: demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $ +$Revision: xxxxxxxxxxxx $ +[extensions] +hgext.keyword = +[keyword] +* = +b = ignore +demo.txt = +[keywordmaps] +Branch = {branches} +$Branch: demobranch $ +% kwshrink should exit silently in empty/invalid repo +% cat +expand $Id$ +do not process $Id: +xxx $ +expand $Id$ +do not process $Id: +xxx $ +ignore $Id$ +% addremove +adding a +adding b +adding sym +% status +A a +A b +A sym +% default keyword expansion including commit hook +% interrupted commit should not change state or run commit hook +a +b +sym +transaction abort! +rollback completed +abort: edit failed: false exited with status 1 +% status +A a +A b +A sym +% commit +a +b +sym +overwriting a expanding keywords +running hook commit.test: cp a hooktest +% status +? hooktest +% identify +f782df5f9602 +% cat +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +ignore $Id$ +% hg cat +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +ignore $Id$ +a +% diff a hooktest +% removing commit hook from config +% touch +% status +% update +3 files updated, 0 files merged, 0 files removed, 0 files unresolved +% cat +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +ignore $Id$ +% copy +% kwfiles added +a +c +% commit +c + c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292 +overwriting c expanding keywords +% cat a c +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +expand $Id: c,v 0ba462c0f077 1970/01/01 00:00:01 user $ +do not process $Id: +xxx $ +% touch copied c after 1 second +% status +% kwfiles +a +c +% diff --rev +diff -r f782df5f9602 c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -0,0 +1,3 @@ ++expand $Id: c,v 0ba462c0f077 1970/01/01 00:00:01 user $ ++do not process $Id: ++xxx $ +% rollback +rolling back last transaction +% status +A c +% update -C +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +% custom keyword expansion +% try with kwdemo +[extensions] +hgext.keyword = +[keyword] +* = +b = ignore +demo.txt = +[keywordmaps] +Xinfo = {author}: {desc} +$Xinfo: test: hg keyword config and expansion example $ +% cat +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $ +do not process $Id: +xxx $ +ignore $Id$ +% hg cat +expand $Id: a f782df5f9602 Thu, 01 Jan 1970 00:00:00 +0000 user $ +do not process $Id: +xxx $ +ignore $Id$ +a +% interrupted commit should not change state +transaction abort! +rollback completed +abort: edit failed: false exited with status 1 +% status +M a +? log +% commit +a +overwriting a expanding keywords +% status +% cat +expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : firstline $ +expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : firstline $ +ignore $Id$ +% hg cat +expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : firstline $ +ignore $Id$ +a +% remove +% status +% rollback +rolling back last transaction +% status +R a +% revert a +% cat a +expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : firstline $ +% clone to test incoming +requesting all changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 3 changes to 3 files +3 files updated, 0 files merged, 0 files removed, 0 files unresolved +% incoming +comparing with test-keyword/Test-a/../Test +searching for changes +changeset: 1:0729690beff6 +tag: tip +user: User Name +date: Thu Jan 01 00:00:02 1970 +0000 +summary: firstline + +% commit rejecttest +a +overwriting a expanding keywords +% export +% import +applying ../rejecttest.diff +% cat +expand $Id: a 82983f13f138 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest +do not process $Id: rejecttest +xxx $ +$Xinfo: User Name : rejects? $ +expand $Id: a 82983f13f138 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest +do not process $Id: rejecttest +xxx $ +$Xinfo: User Name : rejects? $ +ignore $Id$ + +% rollback +rolling back last transaction +% clean update +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +% kwexpand/kwshrink on selected files +% copy a x/a +% kwexpand a +overwriting a expanding keywords +% kwexpand x/a should abort +abort: outstanding uncommitted changes in given files +x/a + x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e +overwriting x/a expanding keywords +% cat a +expand $Id: x/a f27c134d2d9b Thu, 01 Jan 1970 00:00:03 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : xa $ +% kwshrink a inside directory x +overwriting x/a shrinking keywords +% cat a +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +% kwexpand nonexistent +nonexistent: No such file or directory +% switch off expansion +% kwshrink with unknown file u +overwriting a shrinking keywords +overwriting x/a shrinking keywords +% cat +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +ignore $Id$ +% hg cat +expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $ +do not process $Id: +xxx $ +$Xinfo: User Name : firstline $ +ignore $Id$ +a +% cat +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +ignore $Id$ +% hg cat +expand $Id$ +do not process $Id: +xxx $ +$Xinfo$ +ignore $Id$ +a