<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11756">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gits: use @{u} to get upstream branch, not origin/%s<br><br>git has an internal concept of a branch's upstream branch, and the remote need<br>not be 'origin', and also, the upstream branch name may differ completely. So,<br>use git's {u} keyword to obtain the upstream branch name.<br><br>This removes all 'origin' strings from gits. Also, git_branch_exists() is no<br>longer needed, drop it.<br><br>Also remove a couple of default arguments which aren't ever used because we<br>always pass arguments anyway.<br><br>In the case of git_ahead_behind(), we would have use for a default<br>branch_upstream=None to imply calling git_branch_upstream(), but then during<br>rebase, if no upstream exists, we would invoke it twice to get None a second<br>time. So just call the function explicitly. I thought about returning an empty<br>string instead of None, but it's too convoluted.<br><br>Change-Id: Ife146903ae1323a4e568587ccfd4018725e9d719<br>---<br>M src/gits<br>1 file changed, 30 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-dev refs/changes/56/11756/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gits b/src/gits</span><br><span>index 490a6af..681082d 100755</span><br><span>--- a/src/gits</span><br><span>+++ b/src/gits</span><br><span>@@ -58,7 +58,7 @@</span><br><span> </span><br><span> </span><br><span> def git_output(git_dir, *args):</span><br><span style="color: hsl(0, 100%, 40%);">-    return subprocess.check_output(['git', '-C', git_dir, ] + list(args)).decode('utf-8')</span><br><span style="color: hsl(120, 100%, 40%);">+    return subprocess.check_output(['git', '-C', git_dir, ] + list(args), stderr=subprocess.STDOUT).decode('utf-8')</span><br><span> </span><br><span> </span><br><span> def git_bool(git_dir, *args):</span><br><span>@@ -69,20 +69,16 @@</span><br><span>         return False</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def git_branch_exists(git_dir, branch='origin/master'):</span><br><span style="color: hsl(0, 100%, 40%);">-    return git_bool(git_dir, 'rev-parse', '--quiet', '--verify', branch)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def git_ahead_behind(git_dir, branch='master', remote='origin'):</span><br><span style="color: hsl(120, 100%, 40%);">+def git_ahead_behind(git_dir, branch, branch_upstream):</span><br><span>     ''' Count revisions ahead/behind of the remote branch.</span><br><span>         returns: (ahead, behind) (e.g. (0, 5)) '''</span><br><span> </span><br><span>     # Missing remote branch</span><br><span style="color: hsl(0, 100%, 40%);">-    if not git_branch_exists(git_dir, remote + '/' + branch):</span><br><span style="color: hsl(120, 100%, 40%);">+    if not branch_upstream:</span><br><span>         return (0, 0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    behind = git_output(git_dir, 'rev-list', '--count', '%s..%s/%s' % (branch, remote, branch))</span><br><span style="color: hsl(0, 100%, 40%);">-    ahead = git_output(git_dir, 'rev-list', '--count', '%s/%s..%s' % (remote, branch, branch))</span><br><span style="color: hsl(120, 100%, 40%);">+    behind = git_output(git_dir, 'rev-list', '--count', '%s..%s' % (branch, branch_upstream))</span><br><span style="color: hsl(120, 100%, 40%);">+    ahead = git_output(git_dir, 'rev-list', '--count', '%s..%s' % (branch_upstream, branch))</span><br><span>     return (int(ahead.rstrip()), int(behind.rstrip()))</span><br><span> </span><br><span> </span><br><span>@@ -98,12 +94,20 @@</span><br><span>     return ret</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def git_branch_upstream(git_dir, branch_name='HEAD'):</span><br><span style="color: hsl(120, 100%, 40%);">+    '''Return an upstream branch name, or an None if there is none.'''</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        return git_output(git_dir, 'rev-parse', '--abbrev-ref', '%s@{u}' % branch_name).rstrip()</span><br><span style="color: hsl(120, 100%, 40%);">+    except subprocess.CalledProcessError:</span><br><span style="color: hsl(120, 100%, 40%);">+        return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def git_has_modifications(git_dir):</span><br><span>     return not git_bool(git_dir, 'diff-index', '--quiet', 'HEAD')</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def git_can_fast_forward(git_dir, branch='master', remote='origin'):</span><br><span style="color: hsl(0, 100%, 40%);">-    return git_bool(git_dir, 'merge-base', '--is-ancestor', branch, remote + '/' + branch)</span><br><span style="color: hsl(120, 100%, 40%);">+def git_can_fast_forward(git_dir, branch, branch_upstream):</span><br><span style="color: hsl(120, 100%, 40%);">+    return git_bool(git_dir, 'merge-base', '--is-ancestor', branch, branch_upstream)</span><br><span> </span><br><span> </span><br><span> def format_branch_ahead_behind(branch, ahead, behind):</span><br><span>@@ -142,12 +146,14 @@</span><br><span>         if not is_current and branch not in interesting_branch_names:</span><br><span>             continue</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        ahead, behind = git_ahead_behind(git_dir, branch)</span><br><span style="color: hsl(120, 100%, 40%);">+        ahead, behind = git_ahead_behind(git_dir, branch,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         git_branch_upstream(git_dir, branch))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if not ahead and not behind and not is_current:</span><br><span>             # skip branches that are "not interesting"</span><br><span>             continue</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        # Branch with ahead/behind origin info ("master[+1|-5]")</span><br><span style="color: hsl(120, 100%, 40%);">+        # Branch with ahead/behind upstream info ("master[+1|-5]")</span><br><span>         strs.append(format_branch_ahead_behind(branch, ahead, behind))</span><br><span>     return strs</span><br><span> </span><br><span>@@ -238,8 +244,10 @@</span><br><span>         print('Not on a branch: %s' % git_dir)</span><br><span>         raise SkipThisRepo()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    print('Rebasing branch: ' + orig_branch)</span><br><span style="color: hsl(0, 100%, 40%);">-    ahead, behind = git_ahead_behind(git_dir, orig_branch)</span><br><span style="color: hsl(120, 100%, 40%);">+    upstream_branch = git_branch_upstream(git_dir, orig_branch)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print('Rebasing %r onto %r' % (orig_branch, upstream_branch))</span><br><span style="color: hsl(120, 100%, 40%);">+    ahead, behind = git_ahead_behind(git_dir, orig_branch, upstream_branch)</span><br><span> </span><br><span>     if git_has_modifications(git_dir):</span><br><span>         do_commit = ask(git_dir, 'Local mods.',</span><br><span>@@ -262,24 +270,24 @@</span><br><span>             raise SkipThisRepo()</span><br><span> </span><br><span>     # Missing upstream branch</span><br><span style="color: hsl(0, 100%, 40%);">-    if not git_branch_exists(git_dir, 'origin/' + orig_branch):</span><br><span style="color: hsl(120, 100%, 40%);">+    if not upstream_branch:</span><br><span>         print('there is no upstream branch for %r' % orig_branch)</span><br><span> </span><br><span>     # Diverged</span><br><span>     elif ahead and behind:</span><br><span>         do_reset = ask(git_dir, 'Diverged.',</span><br><span style="color: hsl(0, 100%, 40%);">-                       '%s: git reset --hard origin/%s?' % (</span><br><span style="color: hsl(0, 100%, 40%);">-                           orig_branch, orig_branch),</span><br><span style="color: hsl(120, 100%, 40%);">+                       '%s: git reset --hard %s?' % (</span><br><span style="color: hsl(120, 100%, 40%);">+                           orig_branch, upstream_branch),</span><br><span>                        '<empty>  no',</span><br><span>                        'OK  yes (write OK in caps!)',</span><br><span>                        valid_answers=('', 'OK'))</span><br><span> </span><br><span>         if do_reset == 'OK':</span><br><span style="color: hsl(0, 100%, 40%);">-            git(git_dir, 'reset', '--hard', 'origin/%s' % orig_branch)</span><br><span style="color: hsl(120, 100%, 40%);">+            git(git_dir, 'reset', '--hard', upstream_branch)</span><br><span> </span><br><span>     # Behind</span><br><span>     elif behind:</span><br><span style="color: hsl(0, 100%, 40%);">-        if git_can_fast_forward(git_dir, orig_branch):</span><br><span style="color: hsl(120, 100%, 40%);">+        if git_can_fast_forward(git_dir, orig_branch, upstream_branch):</span><br><span>             print('fast-forwarding...')</span><br><span>             git(git_dir, 'merge')</span><br><span>         else:</span><br><span>@@ -303,13 +311,13 @@</span><br><span>             git(git_dir, 'commit', '-am', 'wip', may_fail=True)</span><br><span>             git(git_dir, 'checkout', orig_branch)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        do_reset = ask(git_dir, '%s: git reset --hard origin/%s?' % (orig_branch, orig_branch),</span><br><span style="color: hsl(120, 100%, 40%);">+        do_reset = ask(git_dir, '%s: git reset --hard %s?' % (orig_branch, upstream_branch),</span><br><span>                        '<empty>  no',</span><br><span>                        'OK  yes (write OK in caps!)',</span><br><span>                        valid_answers=('', 'OK'))</span><br><span> </span><br><span>         if do_reset == 'OK':</span><br><span style="color: hsl(0, 100%, 40%);">-            git(git_dir, 'reset', '--hard', 'origin/%s' % orig_branch)</span><br><span style="color: hsl(120, 100%, 40%);">+            git(git_dir, 'reset', '--hard', upstream_branch)</span><br><span> </span><br><span>     return orig_branch</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11756">change 11756</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/11756"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-dev </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ife146903ae1323a4e568587ccfd4018725e9d719 </div>
<div style="display:none"> Gerrit-Change-Number: 11756 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>