The situation is simple:
- we need to send messages to another system
- the developers of the other system need documentation on the layout of these messages
- this is a company-specific protocol (no JSON or anything standard, because we’re talking to old Fortran machines here)
- naturally, the documentation is made in Word files
Taking an example from a session I saw at ngEurope, I decided we might be better off auto-generating this documentation. Keeping Word files in sync with the evolving code is a tedious, manual process, not to mention that the Word files are never in sync 10 years down the road.
And as the code is the single point of truth, I started on automating the process. I hate repeating manual things. It’s boring, allows for manual error (I remember updating a production SQL database instead of the beta database!), and needs to be taught to newcomers time and again.
So:
After having written code to generate the documentation (too specific to put here), I needed a way of having the build automatically add the new file to the pending changes, or if nothing had changed, undo the checkout (sadly, I’m on TFS; git would not have this problem).
So this is how you can compare a local file with the server version of the file:
private bool HasFileChanged(string file, TfsTeamProjectCollection server, Workspace workspace) { string diff; var versionControlServer = server.GetService<VersionControlServer>(); var serverPath = workspace.GetServerItemForLocalItem(file); var serverVersion = new DiffItemVersionedFile(versionControlServer, serverPath, VersionSpec.Latest); var localVersion = new DiffItemLocalFile(file, Encoding.UTF8.CodePage, DateTime.Now, false); using (var stream = new MemoryStream()) using (var writer = new StreamWriter(stream)) { var diffOptions = new DiffOptions { Flags = DiffOptionFlags.EnablePreambleHandling, OutputType = DiffOutputType.Unified, TargetEncoding = Encoding.UTF8, SourceEncoding = Encoding.UTF8, StreamWriter = writer }; Difference.DiffFiles(versionControlServer, serverVersion, localVersion, diffOptions, serverPath, true); writer.Flush(); diff = Encoding.UTF8.GetString(stream.ToArray()); } return diff != ""; }
The server and workspace variables can be made like this:
var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(file); var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri); var workspace = workspaceInfo.GetWorkspace(server);