Patch Set 1:

Hi Dariusz,
I don't know much about the synchronize API.  You can use IContainer getFile / getFolder to get IFile's for non-existent resources (but what does this mean in the context of a compare?).  get*ForLocation does a translation, only if the resource exists...  If the resource really doesn't exist on the left, perhaps you can return null?

As an aside the key thing is what the synchronize view is trying to do.  I guess you're trying to synchronize just IResources visible under the workspace model?  The alternative is to synchronize all filesystem changes between the two refs. 
For example CVS does the former, while clearcase does the latter.  In some sense git is more like clearcase -- the location of the repository root doesn't necessarily correspond with the location of the project or workspace root, and the local repo may contain many resources not all within eclipse.
I think I noticed that synchronizing one project included other projects in the same repo -- so it seems that the synch. action is somewhere between the two? 

If you're just trying to synchronize workspace IResources, then you do also need to be careful to handle groups (virtual folders) and linked resources.  Try creating a new file/folder, press advanced and link to another resource in the filesystem.

Sorry I can't give your better advice.
Cheers,
James