# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1395771064 25200
#      Tue Mar 25 11:11:04 2014 -0700
# Node ID 623cb724c3d0636afc376e85c633bcccb793bf8b
# Parent  5c7943ca051f894b7d7718567a98efe38e96eec9
hg2git: in _init_dirs, store keys without leading '/' (issue103)

Previously, whenever a tree that wasn't the root ('') was stored, we'd prepend
a '/' to it. Then, when we'd try retrieving the entry, we'd do so without the
leading '/'. This caused data loss because existing tree entries were dropped
on the floor. Fix that by only adding '/' if we're adding to a non-empty
initial path.

This wasn't detected in tests because most of them deal only with files in the
root and not ones in subdirectories.

diff --git a/hggit/hg2git.py b/hggit/hg2git.py
--- a/hggit/hg2git.py
+++ b/hggit/hg2git.py
@@ -91,7 +91,11 @@
             self._dirs[path] = tree
             for entry in tree.iteritems():
                 if entry.mode == dirkind:
-                    todo.append((path + '/' + entry.path, store[entry.sha]))
+                    if path == '':
+                        newpath = entry.path
+                    else:
+                        newpath = path + '/' + entry.path
+                    todo.append((newpath, store[entry.sha]))
 
     @property
     def root_tree_sha(self):
diff --git a/tests/test-push.t b/tests/test-push.t
--- a/tests/test-push.t
+++ b/tests/test-push.t
@@ -116,8 +116,56 @@
   no changes found
   [1]
 
+hg-git issue103 -- directories can lose information at hg-git export time
+
+  $ hg up master
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ mkdir dir1
+  $ echo alpha > dir1/alpha
+  $ hg add dir1/alpha
+  $ fn_hg_commit -m 'add dir1/alpha'
+  $ hg push -r master
+  pushing to $TESTTMP/gitrepo
+  searching for changes
+  adding objects
+  added 1 commits with 2 trees and 0 blobs
+  updating reference refs/heads/master
+
+  $ echo beta > dir1/beta
+  $ hg add dir1/beta
+  $ fn_hg_commit -m 'add dir1/beta'
+  $ hg push -r master
+  pushing to $TESTTMP/gitrepo
+  searching for changes
+  adding objects
+  added 1 commits with 2 trees and 0 blobs
+  updating reference refs/heads/master
+  $ hg log -r master
+  changeset:   5:fff64abfde07
+  bookmark:    master
+  tag:         default/master
+  tag:         tip
+  user:        test
+  date:        Mon Jan 01 00:00:15 2007 +0000
+  summary:     add dir1/beta
+  
+
   $ cd ..
 
+  $ hg clone gitrepo hgrepo-test
+  importing git objects into hg
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg -R hgrepo-test log -r master
+  changeset:   4:fff64abfde07
+  bookmark:    master
+  tag:         default/master
+  tag:         tip
+  user:        test
+  date:        Mon Jan 01 00:00:15 2007 +0000
+  summary:     add dir1/beta
+  
+
 Push empty Hg repo to empty Git repo (issue #58)
 Since there aren't any changes, exit code 1 is expected in modern Mercurial.
 However, since it varies between supported Mercurial versions, we need to