[PATCH] De-hardcode 'origin' as the remote name

Mathieu Bridon bochecha at fedoraproject.org
Mon Mar 10 12:01:33 UTC 2014


By default, Git remotes are named 'origin', but some pyrpkg-based tools
might be used to interact with several remotes for the same package
module.

This change allows sites to define how remotes should be called by
simply overriding the Commands.remote attribute.

That attribute is set to "origin" though, to not break existing clones.

The rpkg bash completion resource had to be modified accordingly. Since
the fedpkg one already handles this properly, a simple copy-paste of
that specific line was enough.
---
This is important for us at $dayjob.

We have this rpkg-based tool called nbpkg, which we use to interact with
our packaging infrastructure, similar to fedpkg:

    https://github.com/network-box/nbpkg

But as I'm also a Fedora packager, I like to be able to interact with
both our internal infrastructure, and the Fedora one, in the same Git
clone, as it allows me to easily flow changes in both directions.

This workflow requires having different names for each remote though,
they can't just be all called 'origin'. This patch makes this possible.

I can imagine a similar use case for RHEL packagers, which could
probably want to interact with both the Fedora and RHEL packaging
infrastructures in the same Git clone, flowing changes both ways.

I know RPMFusion would be interested as well (I added Nicolas as CC).

 src/pyrpkg/__init__.py | 21 ++++++++++++++-------
 src/rpkg.bash          |  3 +--
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/pyrpkg/__init__.py b/src/pyrpkg/__init__.py
index c5b4ae4..89a84a2 100644
--- a/src/pyrpkg/__init__.py
+++ b/src/pyrpkg/__init__.py
@@ -135,6 +135,9 @@ class Commands(object):
         self._ver = None
         self.log = log
 
+        # The local name of the remote (might be overridden by subclasses)
+        self.remote = "origin"
+
     # Define properties here
     # Properties allow us to "lazy load" various attributes, which also means
     # that we can do clone actions without knowing things like the spec
@@ -961,6 +964,11 @@ class Commands(object):
         else:
             self.log.debug('Cloning %s' % giturl)
             cmd.extend([giturl])
+
+        if not bare_dir:
+            # --bare and --origin are incompatible
+            cmd.extend(['--origin', self.remote])
+
         self._run_command(cmd, cwd=path)
 
         return
@@ -1009,14 +1017,14 @@ class Commands(object):
         for branch in branches:
             try:
                 # Make a local clone for our branch
-                top_git.clone("--branch", branch, repo_path, branch)
+                top_git.clone("--branch", branch, '--origin', self.remote,
+                        repo_path, branch)
 
-                # Set the origin correctly
+                # Set the remote correctly
                 branch_path = os.path.join(top_path, branch)
                 branch_git = git.Git(branch_path)
-                branch_git.config("--replace-all", "remote.origin.url", giturl)
-                # Bad use of "origin" here, need to fix this when more than one
-                # remote is used.
+                branch_git.config(
+                        "--replace-all", "remote.%s.url" % self.remote, giturl)
             except (git.GitCommandError, OSError), e:
                 raise rpkgError('Could not locally clone %s from %s: %s' %
                         (branch, repo_path, e))
@@ -1452,8 +1460,7 @@ class Commands(object):
             self.log.debug('No local branch found, creating a new one')
             totrack = None
             for remote in remotes:
-                # bad use of "origin" here, will have to be fixed
-                if remote.replace('origin/', '') == branch:
+                if remote.endswith(branch):
                     totrack = remote
                     break
             else:
diff --git a/src/rpkg.bash b/src/rpkg.bash
index 047c98d..a2e45b6 100644
--- a/src/rpkg.bash
+++ b/src/rpkg.bash
@@ -283,8 +283,7 @@ _rpkg_branch()
     local git_options= format="--format %(refname:short)"
     [[ -n $1 ]] && git_options="--git-dir=$1/.git"
 
-    git $git_options for-each-ref $format 'refs/remotes/origin/*' \
-        | sed 's,origin/,,'
+    git $git_options for-each-ref $format 'refs/remotes' | sed 's,.*/,,'
     git $git_options for-each-ref $format 'refs/heads'
 }
 
-- 
1.8.5.3



More information about the rel-eng mailing list