git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 16/20] transport-helper: update ref status after push with export

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Jun 19, 2011, 15:18 UTC
Message-ID
<1308496725-22329-17-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1308496725-22329-1-git-send-email-srabbelier@gmail.com>
Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
---
  This time a proper implementation of this patch.
 git-remote-testgit.py              |    6 +++++-
 git_remote_helpers/git/importer.py |   28 +++++++++++++++++++++++++++-
 git_remote_helpers/util.py         |   34 ++++++++++++++++++++++++++++++++++
 transport-helper.c                 |    1 +
 4 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/git-remote-testgit.py b/git-remote-testgit.py
index a8e47d9..854e27e 100644
--- a/git-remote-testgit.py
+++ b/git-remote-testgit.py
@@ -148,11 +148,15 @@ def do_export(repo, args):
     sys.stdout.flush()
 
     update_local_repo(repo)
-    repo.importer.do_import(repo.gitdir)
+    changed = repo.importer.do_import(repo.gitdir)
 
     if not repo.local:
         repo.non_local.push(repo.gitdir)
 
+    for ref in changed:
+        print "ok %s" % ref
+    print
+
 
 def do_gitdir(repo, args):
     """Stores the location of the gitdir.
diff --git a/git_remote_helpers/git/importer.py b/git_remote_helpers/git/importer.py
index 02a719a..5c6b595 100644
--- a/git_remote_helpers/git/importer.py
+++ b/git_remote_helpers/git/importer.py
@@ -1,7 +1,7 @@
 import os
 import subprocess
 
-from git_remote_helpers.util import check_call
+from git_remote_helpers.util import check_call, check_output
 
 
 class GitImporter(object):
@@ -16,6 +16,18 @@ class GitImporter(object):
 
         self.repo = repo
 
+    def get_refs(self, gitdir):
+        """Returns a dictionary with refs.
+        """
+        args = ["git", "--git-dir=" + gitdir, "for-each-ref", "refs/heads"]
+        lines = check_output(args).strip().split('\n')
+        refs = {}
+        for line in lines:
+            value, name = line.split(' ')
+            name = name.strip('commit\t')
+            refs[name] = value
+        return refs
+
     def do_import(self, base):
         """Imports a fast-import stream to the given directory.
 
@@ -32,9 +44,23 @@ class GitImporter(object):
         if not os.path.exists(dirname):
             os.makedirs(dirname)
 
+        refs_before = self.get_refs(gitdir)
+
         args = ["git", "--git-dir=" + gitdir, "fast-import", "--quiet", "--export-marks=" + path]
 
         if os.path.exists(path):
             args.append("--import-marks=" + path)
 
         check_call(args)
+
+        refs_after = self.get_refs(gitdir)
+
+        changed = {}
+
+        for name, value in refs_after.iteritems():
+            if refs_before.get(name) == value:
+                continue
+
+            changed[name] = value
+
+        return changed
diff --git a/git_remote_helpers/util.py b/git_remote_helpers/util.py
index 8b9f302..6a9ec5c 100644
--- a/git_remote_helpers/util.py
+++ b/git_remote_helpers/util.py
@@ -160,6 +160,40 @@ def check_call(*popenargs, **kwargs):
     return 0
 
 
+# from python2.7:subprocess.py
+def check_output(*popenargs, **kwargs):
+    r"""Run command with arguments and return its output as a byte string.
+
+    If the exit code was non-zero it raises a CalledProcessError.  The
+    CalledProcessError object will have the return code in the returncode
+    attribute and output in the output attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    >>> check_output(["ls", "-l", "/dev/null"])
+    'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'
+
+    The stdout argument is not allowed as it is used internally.
+    To capture standard error in the result, use stderr=STDOUT.
+
+    >>> check_output(["/bin/sh", "-c",
+    ...               "ls -l non_existent_file ; exit 0"],
+    ...              stderr=STDOUT)
+    'ls: non_existent_file: No such file or directory\n'
+    """
+    if 'stdout' in kwargs:
+        raise ValueError('stdout argument not allowed, it will be overridden.')
+    process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
+    output, unused_err = process.communicate()
+    retcode = process.poll()
+    if retcode:
+        cmd = kwargs.get("args")
+        if cmd is None:
+            cmd = popenargs[0]
+        raise subprocess.CalledProcessError(retcode, cmd)
+    return output
+
+
 def file_reader_method (missing_ok = False):
     """Decorator for simplifying reading of files.
 
diff --git a/transport-helper.c b/transport-helper.c
index b0361c2..bb1b97f 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -760,6 +760,7 @@ static int push_refs_with_export(struct transport *transport,
 	data->no_disconnect_req = 1;
 	if (finish_command(&exporter))
 		die("Error while running fast-export");
+	push_update_refs_status(data, remote_refs);
 	return 0;
 }
 
-- 
1.7.5.1.292.g728120
Previous: Sverre RabbelierNext: Jonathan Nieder
Message 30 of 44 in “remote-helper improvements”
  1. 00/20 remote-helper improvementsSverre Rabbelier, Jun 19, 2011
  2. 01/20 transport-helper: fix minor leak in push_refs_with_exportSverre Rabbelier, Jun 19, 2011
  3. 02/20 t5800: factor out some ref testsSverre Rabbelier, Jun 19, 2011
  4. 03/20 t5800: use skip_all instead of prereqSverre Rabbelier, Jun 19, 2011
  5. 04/20 t5800: document some non-functional parts of remote helpersSverre Rabbelier, Jun 19, 2011
  6. Jonathan NiederJun 19, 2011
  7. Sverre RabbelierJul 4, 2011
  8. 05/20 teach remote-testgit to import non-HEAD refsSverre Rabbelier, Jun 19, 2011
  9. 06/20 transport-helper: don't feed bogus refs to export pushSverre Rabbelier, Jun 19, 2011
  10. 07/20 git_remote_helpers: push all refs during a non-local exportSverre Rabbelier, Jun 19, 2011
  11. 08/20 remote-curl: accept empty line as terminatorSverre Rabbelier, Jun 19, 2011
  12. Jonathan NiederJun 19, 2011
  13. Sverre RabbelierJul 4, 2011
  14. 08/20 remote-curl: accept empty line as terminatorDmitry Ivankov, Jun 20, 2011
  15. Jonathan NiederJun 20, 2011
  16. Junio C HamanoJun 20, 2011
  17. 09/20 git-remote-testgit: only push for non-local repositoriesSverre Rabbelier, Jun 19, 2011
  18. 10/20 git-remote-testgit: fix error handlingSverre Rabbelier, Jun 19, 2011
  19. Jonathan NiederJun 19, 2011
  20. Brandon CaseyJun 20, 2011
  21. Sverre RabbelierJun 20, 2011
  22. 11/20 fast-import: introduce 'done' commandSverre Rabbelier, Jun 19, 2011
  23. 12/20 fast-export: support done featureSverre Rabbelier, Jun 19, 2011
  24. 13/20 transport-helper: factor out push_update_refs_statusSverre Rabbelier, Jun 19, 2011
  25. 14/20 transport-helper: check status code of finish_commandSverre Rabbelier, Jun 19, 2011
  26. 15/20 transport-helper: use the new done feature where possibleSverre Rabbelier, Jun 19, 2011
  27. Jonathan NiederJun 20, 2011
  28. Junio C HamanoJun 20, 2011
  29. Sverre RabbelierJul 4, 2011
  30. 16/20 transport-helper: update ref status after push with exportSverre Rabbelier, Jun 19, 2011
  31. Jonathan NiederJun 19, 2011
  32. Junio C HamanoJun 21, 2011
  33. Sverre RabbelierJun 21, 2011
  34. 17/20 transport-helper: change import semanticsSverre Rabbelier, Jun 19, 2011
  35. Jonathan NiederJun 19, 2011
  36. Sverre RabbelierJul 4, 2011
  37. Jonathan NiederJul 4, 2011
  38. Sverre RabbelierJul 4, 2011
  39. Jonathan NiederJul 4, 2011
  40. 18/20 transport-helper: export is no longer always the last commandSverre Rabbelier, Jun 19, 2011
  41. 19/20 transport-helper: Use capname for gitdir capability tooSverre Rabbelier, Jun 19, 2011
  42. 20/20 transport-helper: implement marks location as capabilitySverre Rabbelier, Jun 19, 2011
  43. Jonathan NiederJun 20, 2011
  44. Sverre RabbelierJul 4, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.