Push logic: ``` @unison/base:main> project.push [project:branch] ``` If not on a branch, bail. Resolve where to push: - If project/branch names provided - If project_id/branch_id in remote_project/remote_project_branch tables - goto 1 (project_id branch_id) - else - if the ids exist on Share - goto 1 (project_id branch_id) - else - create them on Share - goto 2 - Else project/branch names not provided - If default push project_id exists - If default push branch_id exists - Goto 1 - Else default push branch_id doesn't exist - If this branch name exists under the default project_id - goto 1 (project_id, branch_id) - Else - create the branch on Share - Goto 2 - Else default push location doesn't exist - Get my username - Do all the logic with the label 1: Now we have remote (project_id, branch_id) label 2: -- else if (default push location exists), -- if (its remote branch id is non-null) -- use that -- else -- if (this branch name exists in that project) -- use that -- else -- create a branch with this name -- else -- ask Share for my username -- if (I'm not logged in) -- fail -- don't know where to push -- else