code: func (old *Manifest_Directory) Diff(new *Manifest_Directory) *ManifestDiff_Directory {
  	ret := &ManifestDiff_Directory{}
  
  	ret.Overall = zeroCmpTwo(old, new, func() ManifestDiff_Stat {
  		var dirChanged modifiedTracker
  
  		if ret.GitCheckout = old.GitCheckout.Diff(new.GitCheckout); ret.GitCheckout != nil {
  			dirChanged.add(ret.GitCheckout.Overall)
  		}
  
  		ret.CipdServerHost = dirChanged.add(zeroCmpTwo(old.CipdServerHost, new.CipdServerHost, nil))
  		if ret.CipdServerHost == ManifestDiff_EQUAL && new.CipdServerHost != "" {
  			cipdPackages := map[string]ManifestDiff_Stat{}
  
  			for name, pkg := range old.CipdPackage {
  				cipdPackages[name] = dirChanged.add(pkg.Diff(new.CipdPackage[name]))
  			}
  			for name, pkg := range new.CipdPackage {
  				if _, ok := cipdPackages[name]; !ok {
  					cipdPackages[name] = dirChanged.add(old.CipdPackage[name].Diff(pkg))
  				}
  			}
  
  			if len(cipdPackages) > 0 {
  				ret.CipdPackage = cipdPackages
  			}
  		}
  
  		ret.IsolatedServerHost = dirChanged.add(zeroCmpTwo(old.IsolatedServerHost, new.IsolatedServerHost, nil))
  		ret.Isolated = dirChanged.add(IsolatedDiff(old.Isolated, new.Isolated))
  
  		return dirChanged.status()
  	})
  
  	return ret
  }
docs: // Diff generates a ManifestDiff_Directory object which shows what changed
  // between the `old` manifest directory and the `new` manifest directory.