[Sugar-devel] Analysing code changes, git diff

Simon Schampijer simon at schampijer.de
Thu Sep 9 09:02:23 EDT 2010


On 09/09/2010 02:08 PM, Sascha Silbe wrote:
> Excerpts from James Cameron's message of Thu Sep 09 03:24:36 +0200 2010:
>
>> Sorry, I used tabify in emacs, so as to force the diff to show the
>> entire function as changed.  I had said I "replaced tabs with spaces",
>> but I should have said "replaced spaces with tabs".  This is only
>> because I don't know how to drive git diff well enough.
>
> This brings up something I have been brooding about for some time now:
>
> The default output of "git diff" often isn't very useful for
> understanding a patch or even just merging changes. It's a low-level
> representation and, when comparing Python code, often not even a good
> one.
>
> I know git can be configured to use external "diff drivers" and "merge
> drivers" (see also [6]), so maybe we can improve this. That's why I
> started a new thread: Others might be aware of tools that can be used,
> either as-is or after some integration work (or at least on their own).
>
>
> There are two different things that bug me about "git diff" when applied
> to the Sugar source code:
>
>
> 1. The built-in algorithm is generic (good) and always language-
>     agnostic (bad). For Python code, this often results in:
>
>     I. Choosing unsuitable borders.
>        Example:
>
> @@ -81,15 +82,19 @@ def _async_copy(self, file_path, destination_path, completion_cb,
>                   unlink_src)
>           async_copy.start()
>
> -    def retrieve(self, uid, user_id, extension):
> +    def has_data(self, object_id):
> +        file_path = layoutmanager.get_instance().get_data_path(object_id)
> +        return os.path.exists(file_path)
> +
> +    def retrieve(self, object_id, user_id, extension):
>           """Place the file associated to a given entry into a directory
>              where the user can read it. The caller is reponsible for
>              deleting this file.
>
>           """
>
>        This mixes up the changes to retrieve (only signature changed) and
>        adding a new method has_data(). When handling conflicts, the above
>        output is unnecessarily hard to understand and resolve.
>        What I would have liked to see instead is:
>
> +    def has_data(self, object_id):
> +        file_path = layoutmanager.get_instance().get_data_path(object_id)
> +        return os.path.exists(file_path)
> +
> -    def retrieve(self, uid, user_id, extension):
> +    def retrieve(self, object_id, user_id, extension):
>           """Place the file associated to a given entry into a directory
>              where the user can read it. The caller is reponsible for
>              deleting this file.
>
>           """

FWIW, I understand your example and the frustration well. Have been put 
off by it myself. I often use the diff and the copy of the original code 
and/or final code near by to understand bigger refactorings. Which is 
not very handy of course.

So far, I have not come across better tools but will let you know if I 
see better.

Regards,
    Simon





More information about the Sugar-devel mailing list