MohamedG's Log

TW9oYW1lZCBFbC1HZWlzaA==

How to: Label items in a changeset using tf label?

We can specify the versionspec to tf label either by supplying the /v or /version argument (for example, /v:C1256), or by appending it to the itemspec (for example, foo.cs;C1256). Here’s an example that attaches the “goodbuild” label to version 1256 of $/proj/foo.cs:


tf label goodbuild /v:1256 $/proj/foo.cs


What about labeling all items in a certain changeset? We need to get a list of these items first:


tf changeset 1256


But this will invoke the changeset dialog, so we have to use the /noprompt  or /i to get the output in the command prompt window:


tf changeset 1256 /i


The output includes extra info like changeset number, owner, date, comment, and check-in notes. To extract the lines of the Items section, which contains the itemspecs, pipe the output to the find command:


tf changeset 1256 /i | find “$/”


This should work just fine as long as “$/” doesn’t show up else where, in a comment for instance. Apply more filters if necessary! The output should look like the following:


    add        $/proj/foo.cs
    edit       $/proj/fold/bar.cs
    …


We still got the Change column to get rid of, this can be accomplished using the parsing keywords of the for command that we will use for iteration:


for /f “usebackq tokens=2 delims=$” %i in (`tf changeset 1256 /i ^| find “$/”`) do tf label goodbuild /v:1256 $%i


We used the for command to iterate, the /f option specifies file parsing, and the “usebackq” parsing keyword indicates that the input file is the output of the command in the back quoted string, which in this case is:


`tf changeset 1256 /i ^| find “$/”`


We added the caret “^” to escape piping “|”, otherwise, we will get the following error message:


| was unexpected at this time.


The parsing keywords do a great job to parse each line; “token=2 delims=$” passes the 2nd token from each line to the for body, with tokens delimited by $. That’s why we had to prepend the $ to the itemspec in the for body as we lost it while parsing:


tf label goodbuild /v:1256 $%i


We may use any of the ways we saw before to specify the versionspec, such as:


tf label goodbuild $%i;C1256


So, the command would look like the following:


for /f “usebackq tokens=2 delims=$” %i in (`tf changeset 1256 /i ^| find “$/”`) do tf label goodbuild $%i;C1256