I want to be able to interrogate TfsTeamProjectCollection and determine if there is a newer version of a file on the server. I would like to be able to do this without actually fetching the file.
Is this possible somewhere? I've done some scratching around and so far drawing blanks.
Thanks.
The easiest way is to QueryHistory
between the workspace version and the latest version; if they differ, there exists a newer latest version on the server. Eg:
versionControlServer.QueryHistory(
serverPath,
VersionSpec.Latest,
0,
RecursionType.Full,
new WorkspaceVersionSpec(workspace),
versionFrom,
null,
Int32.MaxValue,
true,
true);
This is another way to check whether a given file is latest or not.
string file_path = @"your_file_path";
WorkspaceInfo info = Workstation.Current.GetLocalWorkspaceInfo(file_path);
Workspace ws = info.GetWorkspace(new TfsTeamProjectCollection(info.ServerUri));
GetStatus status = ws.Get( new GetRequest(
new ItemSpec ( file_path, RecursionType.Full ),
VersionSpec.Latest ),
GetOptions.Preview );
if(status.NoActionNeeded)
MessegeBox.Show("Latest");
else
MessegeBox.Show("Not Latest");
STEPS
1) We need to get the Workspace
that contains the file path. We use
Workstation.GetLocalWorkspaceInfo Method (String)
to get WorkspaceInfo
object which contains properties of the Workspace that contains the specified file.
We can use this WorkspaceInfo
object to get the instance of that workspace by using
WorkspaceInfo.GetWorkspace Method (TfsTeamProjectCollection)
2) Now we need to perform a Get
Operation with the workspace object.
Workspace.Get Method (GetRequest[], GetOptions)
The second parameter, GetOptions
has six possible member values. Each with a purpose.
Since you don't need to download the file,
we will use the member value Preview
which Executes a get without modifying the disk.
3) The Get
operation returns a GetStatus
object which represents the status of a Workspace.Get
operation.
This contains information about how many operations, conflicts, errors, and so on occurred when the Get
operation was being processed.
GetStatus
object has a number of properties. We use property called NoActionNeeded
which gets a flag that indicates whether no failures and no operations occurred.
The flag value will be True if no operations or errors occurred. ie, the file is already the latest version. Otherwise the flag will be False which means the file is not the latest version available in TFS.
//We have to specify files which are already mapped with local workspace for compare here
var serverPath = workspace.GetServerItemForLocalItem(Vars.sLocalPath);
var serverVersion = new DiffItemVersionedFile(versionControlServer, serverPath, VersionSpec.Latest);
var localVersion = new DiffItemLocalFile(Vars.sLocalPath, System.Text.Encoding.UTF8.CodePage, DateTime.Now, false);
try
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
{
var diffOptions = new DiffOptions
{
Flags = DiffOptionFlags.EnablePreambleHandling,
OutputType = DiffOutputType.Unified,
TargetEncoding = System.Text.Encoding.UTF8,
SourceEncoding = System.Text.Encoding.UTF8,
StreamWriter = writer
};
Difference.DiffFiles(versionControlServer, serverVersion, localVersion, diffOptions, serverPath, true);
writer.Flush();
diff = System.Text.Encoding.UTF8.GetString(stream.ToArray());
if (diff != "")
{
newutils.WriteLogFile("Vars.enumExitCode.Success");
iRtnCode = (int)Vars.enumExitCode.Success;
return iRtnCode;
}
}
}
catch (Exception)
{
}