Damien Robert <damien.olivier.robert@xxxxxxxxx> writes: >> By the way, I have a bit higher-level question. >> >> All of the above logic that decides what should happen in "git push" >> MUST have existing code we already use to implement "git push", no? > > Yes. > >> Why do we need to reinvent it here, instead of reusing the existing >> code? Is it because the interface into the functions that implement >> the existing logic is very different from what this function wants? > > Mostly yes. The logic of git push is to massage the refspecs directly, for > instance: > case PUSH_DEFAULT_MATCHING: > refspec_append(&rs, ":"); > case PUSH_DEFAULT_CURRENT: > ... > strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname); > case PUSH_DEFAULT_UPSTREAM: > ... > strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src); > > And the error messages are also not the same, and to give a good error > message we need to parse the different cases. > > It may be possible to refactorize all this, but not in an obvious way and > it would be a lot more work than this patch series. Yeah, in light of the analysis I agree it makes sense to take the approach of these two patches, at least for now. Thanks.