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

[PATCH 05/20] remote-bzr: add support to push merges

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 26, 2013, 01:07 UTC
Message-ID
<1366938488-25425-6-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1366938488-25425-1-git-send-email-felipe.contreras@gmail.com>

In order to do that, we need to store the marks of every file, so that they can be fetched when needed. Unfortunately we can't tell bazaar that nothing changed, we need to send the data so that it can figure it out by itself.

And since it will be requesting a bunch of information by the file_id, it's better to have a helper dict (rev_files), so that we can fetch it quickly.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/remote-helpers/git-remote-bzr | 29 ++++++++++++++++++++--------
 contrib/remote-helpers/test-bzr.sh    | 36 +++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 8 deletions(-)
diff --git a/contrib/remote-helpers/git-remote-bzr b/contrib/remote-helpers/git-remote-bzr
index eb91d28..6a7f836 100755
--- a/contrib/remote-helpers/git-remote-bzr
+++ b/contrib/remote-helpers/git-remote-bzr
@@ -393,7 +393,7 @@ class CustomTree():
             tree = repo.repository.revision_tree(revid)
             try:
                 for path, entry in tree.iter_entries_by_dir():
-                    files[path] = entry.file_id
+                    files[path] = [entry.file_id, None]
             finally:
                 repo.unlock()
             return files
@@ -408,12 +408,18 @@ class CustomTree():
                 self.base_files = copy_tree(self.base_id)
 
         self.files = files_cache[revid] = self.base_files.copy()
+        self.rev_files = {}
+
+        for path, data in self.files.iteritems():
+            fid, mark = data
+            self.rev_files[fid] = [path, mark]
 
         for path, f in files.iteritems():
-            fid = self.files.get(path, None)
+            fid, mark = self.files.get(path, [None, None])
             if not fid:
                 fid = bzrlib.generate_ids.gen_file_id(path)
             f['path'] = path
+            self.rev_files[fid] = [path, mark]
             self.updates[fid] = f
 
     def last_revision(self):
@@ -423,10 +429,10 @@ class CustomTree():
         changes = []
 
         def get_parent(dirname, basename):
-            parent_fid = self.base_files.get(dirname, None)
+            parent_fid, mark = self.base_files.get(dirname, [None, None])
             if parent_fid:
                 return parent_fid
-            parent_fid = self.files.get(dirname, None)
+            parent_fid, mark = self.files.get(dirname, [None, None])
             if parent_fid:
                 return parent_fid
             if basename == '':
@@ -453,7 +459,7 @@ class CustomTree():
                     (None, basename),
                     (None, kind),
                     (None, executable))
-            self.files[path] = change[0]
+            self.files[path] = [change[0], None]
             changes.append(change)
 
         def update_entry(fid, path, kind, mode = None):
@@ -474,7 +480,7 @@ class CustomTree():
                     (None, basename),
                     (None, kind),
                     (None, executable))
-            self.files[path] = change[0]
+            self.files[path] = [change[0], None]
             changes.append(change)
 
         def remove_entry(fid, path, kind):
@@ -503,16 +509,23 @@ class CustomTree():
             else:
                 add_entry(fid, path, 'file', f['mode'])
 
+            self.files[path][1] = f['mark']
+            self.rev_files[fid][1] = f['mark']
+
         return changes
 
     def get_file_with_stat(self, file_id, path=None):
-        mark = self.updates[file_id]['mark']
+        path, mark = self.rev_files[file_id]
         return (StringIO.StringIO(blob_marks[mark]), None)
 
     def get_symlink_target(self, file_id):
-        mark = self.updates[file_id]['mark']
+        path, mark = self.rev_files[file_id]
         return blob_marks[mark]
 
+    def id2path(self, file_id):
+        path, mark = self.rev_files[file_id]
+        return path
+
 def c_style_unescape(string):
     if string[0] == string[-1] == '"':
         return string.decode('string-escape')[1:-1]
diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh
index 34666e1..eca3476 100755
--- a/contrib/remote-helpers/test-bzr.sh
+++ b/contrib/remote-helpers/test-bzr.sh
@@ -228,4 +228,40 @@ test_expect_success 'push utf-8 filenames' '
   test_cmp expected actual
 '
 
+test_expect_success 'pushing a merge' '
+  mkdir -p tmp && cd tmp &&
+  test_when_finished "cd .. && rm -rf tmp" &&
+
+  (
+  bzr init bzrrepo &&
+  cd bzrrepo &&
+  echo one > content &&
+  bzr add content &&
+  bzr commit -m one
+  ) &&
+
+  git clone "bzr::$PWD/bzrrepo" gitrepo &&
+
+  (
+  cd bzrrepo &&
+  echo two > content &&
+  bzr commit -m two
+  ) &&
+
+  (
+  cd gitrepo &&
+  echo three > content &&
+  git commit -a -m three &&
+  git fetch &&
+  git merge origin/master || true &&
+  echo three > content &&
+  git commit -a --no-edit &&
+  git push
+  ) &&
+
+  echo three > expected &&
+  cat bzrrepo/content > actual &&
+  test_cmp expected actual
+'
+
 test_done
-- 
1.8.2.1.884.g3532a8d
Previous: Felipe ContrerasNext: Felipe Contreras
Message 6 of 29 in “remote-bzr: massive changes”
  1. 00/20 remote-bzr: massive changesFelipe Contreras, Apr 26, 2013
  2. 01/20 remote-bzr: cleanup CustomTreeFelipe Contreras, Apr 26, 2013
  3. 02/20 remote-bzr: delay blob fetching until the very endFelipe Contreras, Apr 26, 2013
  4. 03/20 remote-bzr: fix order of locking in CustomTreeFelipe Contreras, Apr 26, 2013
  5. 04/20 remote-bzr: always try to update the worktreeFelipe Contreras, Apr 26, 2013
  6. 05/20 remote-bzr: add support to push mergesFelipe Contreras, Apr 26, 2013
  7. 06/20 remote-bzr: fixes for branch divergeFelipe Contreras, Apr 26, 2013
  8. 07/20 remote-bzr: fix partially pushed mergeFelipe Contreras, Apr 26, 2013
  9. 08/20 remote-bzr: use branch variable when appropriateFelipe Contreras, Apr 26, 2013
  10. 09/20 remote-bzr: add support for bzr reposFelipe Contreras, Apr 26, 2013
  11. 10/20 remote-bzr: fix branch namesFelipe Contreras, Apr 26, 2013
  12. 11/20 remote-bzr: add support for shared repoFelipe Contreras, Apr 26, 2013
  13. 12/20 remote-bzr: split marks fileFelipe Contreras, Apr 26, 2013
  14. Felipe ContrerasApr 26, 2013
  15. Junio C HamanoApr 27, 2013
  16. Felipe ContrerasApr 27, 2013
  17. Junio C HamanoApr 28, 2013
  18. Felipe ContrerasApr 29, 2013
  19. 13/20 remote-bzr: improve author sanitazionFelipe Contreras, Apr 26, 2013
  20. 14/20 remote-bzr: add custom method to find branchesFelipe Contreras, Apr 26, 2013
  21. 15/20 remote-bzr: add option to specify branchesFelipe Contreras, Apr 26, 2013
  22. 16/20 remote-bzr: improve progress reportingFelipe Contreras, Apr 26, 2013
  23. 17/20 remote-bzr: iterate revisions properlyFelipe Contreras, Apr 26, 2013
  24. 18/20 remote-bzr: delay peer branch usageFelipe Contreras, Apr 26, 2013
  25. 19/20 remote-bzr: access branches only when neededFelipe Contreras, Apr 26, 2013
  26. 20/20 remote-bzr: export HEADFelipe Contreras, Apr 26, 2013
  27. Felipe ContrerasApr 26, 2013
  28. Junio C HamanoApr 26, 2013
  29. Felipe ContrerasApr 26, 2013

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.