For reference, the behavior of the `git_index_update_all` callback's return value is:

* if you return 0, then the item will be updated in the index
* if you return a value greater than 0, then the item will be skipped but the iteration will continue
* if you return a value less than 0, then the remainder of the iteration will be aborted and the value you returned will be returned to the caller

If you want to distinguish between an internal libgit2 error that aborted the operation and your callback's return value, you can return the value `GIT_EUSER` which will never be generated internally by libgit2 and can only be generated by user callback functions.

I'm not sure what is a natural way to capture those behaviors in an Objective C setting, but those are the underlying options.