Преглед изворни кода

[add] commit trees is working

isundil пре 7 година
родитељ
комит
cc8f0b7d04

+ 18 - 79
app/src/main/java/info/knacki/pass/git/GitSha1.java

@@ -1,12 +1,10 @@
 package info.knacki.pass.git;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.logging.Logger;
 
 import info.knacki.pass.git.entities.GitObject;
 import info.knacki.pass.git.entities.GitPackable;
@@ -29,84 +27,28 @@ public class GitSha1 {
         return sb.toString();
     }
 
-    public static String getSha1OfFile(String rootPath, String filePath)
+    public static byte[] getRawSha1OfFile(final File f)
     {
-        byte[] raw = getRawSha1OfFile(new File(rootPath +filePath));
-        return raw.length == 0 ? "" : BytesToString(raw);
-    }
-
-    public static byte[] getRawSha1OfFile(String rootPath, String filePath)
-    {
-        return getRawSha1OfFile(new File(rootPath +filePath));
-    }
-
-    public static byte[] getRawSha1OfFile(File f)
-    {
-        try
-        {
-            MessageDigest shaHash = MessageDigest.getInstance("SHA1");
-            byte[] pack = GitObject.GitBlob.GetFilePack(f);
-            int len = pack.length;
-            ByteArrayOutputStream tmp = new ByteArrayOutputStream();
-            tmp.write(("blob " +len).getBytes());
-            tmp.write(new byte[] { 0 });
-            tmp.write(pack);
-            shaHash.update(tmp.toByteArray());
-            byte[] sha1sum = shaHash.digest();
-            Logger.getAnonymousLogger().severe("Sha1 for " +f.getAbsolutePath() +": " +GitSha1.BytesToString(sha1sum));
-            return sha1sum;
-        }
-        catch (FileNotFoundException e) {
-            return new byte[]{};
-        }
-        catch(IOException t) {
-            t.printStackTrace();
-        }
-        catch (NoSuchAlgorithmException t) {
-            t.printStackTrace();
-        }
-        return new byte[] {};
-    }
-
-    public static byte[] getTreeMsg(String rootPath, GitObject.GitTree tree) {
-        ByteArrayOutputStream str = new ByteArrayOutputStream();
-
-        try {
-            for (GitObject go : tree.GetObjects()) {
-                str.write((go.GetMode() + ' ').getBytes());
-                str.write(go.GetFilename().getBytes());
-                str.write(new byte[]{0});
-                str.write(getRawSha1OfObject(rootPath, go));
+        return getRawSha1OfPackable(new GitPackable() {
+            @Override
+            public eType GetPackableType() {
+                return eType.eType_Blob;
             }
-        }
-        catch (IOException e) {}
-        return str.toByteArray();
-    }
 
-    private static byte[] getRawSha1OfTree(String rootPath, GitObject.GitTree tree) {
-        try {
-            MessageDigest sha1Builder = MessageDigest.getInstance("SHA1");
-            byte[] msg = getTreeMsg(rootPath, tree);
-            sha1Builder.update(("tree " +msg.length).getBytes());
-            sha1Builder.update(new byte[] { 0 });
-            sha1Builder.update(msg);
-            byte[] digest = sha1Builder.digest();
-            return digest;
-        }
-        catch (NoSuchAlgorithmException e) {
-            return new byte[]{};
-        }
-    }
+            @Override
+            public byte[] GetPack() {
+                try {
+                    return GitObject.GitBlob.GetFilePack(f);
+                }
+                catch (FileNotFoundException e) {
 
-    private static byte[] getRawSha1OfBlob(String rootPath, GitObject.GitBlob blob) {
-        return getRawSha1OfFile(rootPath, blob.GetGitPath());
-    }
+                }
+                catch (IOException e) {
 
-    public static byte[] getRawSha1OfObject(String rootPath, GitObject obj) {
-        byte[] hash = obj.GetHash();
-        if (hash != null)
-            return hash;
-        return obj instanceof GitObject.GitTree ? getRawSha1OfTree(rootPath, (GitObject.GitTree) obj) : getRawSha1OfBlob(rootPath, (GitObject.GitBlob) obj);
+                }
+                return new byte[]{};
+            }
+        });
     }
 
     public static byte[] getRawSha1OfPackable(GitPackable obj) {
@@ -116,10 +58,7 @@ public class GitSha1 {
             sha1Builder.update((GitPackableUtil.GetObjTypeString(obj.GetPackableType()) +" " +packContent.length).getBytes());
             sha1Builder.update(new byte[] { 0 });
             sha1Builder.update(packContent);
-            byte[] digest = sha1Builder.digest();
-            if (obj instanceof GitObject.GitBlob)
-                Logger.getLogger(GitSha1.class.getName()).severe("Coucou sha for " +new String(obj.GetPack()) +" is " +BytesToString(digest));
-            return digest;
+            return sha1Builder.digest();
         }
         catch (NoSuchAlgorithmException e) {
             return new byte[]{};

+ 3 - 2
app/src/main/java/info/knacki/pass/git/HttpGitProtocol.java

@@ -32,7 +32,7 @@ import info.knacki.pass.git.entities.GitRef;
 import info.knacki.pass.io.OutputStreamWithCheckSum;
 import info.knacki.pass.settings.SettingsManager;
 
-public class HttpGitProtocol implements GitInterface { // FIXME package-private
+class HttpGitProtocol implements GitInterface {
     private final SettingsManager.Git fConfig;
     private GitRef[] fRefsCache = null;
     private static final Logger log = Logger.getLogger(HttpGitProtocol.class.getName());
@@ -461,6 +461,7 @@ public class HttpGitProtocol implements GitInterface { // FIXME package-private
                 return false;
             msg.write(GitPackableUtil.getObjHeader(i.GetPackableType(), pack.length))
                 .write(GitPackableUtil.deflate(pack));
+            String tmp = GitSha1.getSha1OfPackable(i);
             log.severe("Writing pack " +i.GetPackableType() +", " +GitSha1.getSha1OfPackable(i) +new String(i.GetPack()));
         }
         msg.writeSha1();
@@ -487,7 +488,7 @@ public class HttpGitProtocol implements GitInterface { // FIXME package-private
                             @Override
                             public void onResponse(byte[] result) {
                                 Logger.getAnonymousLogger().severe("git-receive-pack " +new String(result, Charset.defaultCharset()));
-                                response.onResponse(null);
+                                //response.onResponse(null);
                             }
 
                             @Override

+ 22 - 13
app/src/main/java/info/knacki/pass/git/entities/GitCommit.java

@@ -4,17 +4,14 @@ import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.ArrayDeque;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.Locale;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
-import java.util.logging.Logger;
 
 import info.knacki.pass.git.GitSha1;
 
 public class GitCommit implements GitPackable {
-    private final static Logger log = Logger.getLogger(GitCommit.class.getName());
-
     private String fHash;
     private byte[] fTreeHash;
     private GitObject.GitTree fTree;
@@ -22,6 +19,7 @@ public class GitCommit implements GitPackable {
     private String fAuthor;
     private String fCommitter;
     private String fMessage;
+    private Date fTime;
 
     public GitCommit(String hash, String sha1Content) {
         int pos = sha1Content.indexOf('\0');
@@ -41,7 +39,7 @@ public class GitCommit implements GitPackable {
             else if (line.startsWith("author"))
                 fAuthor = Util.RemoveHead(line);
             else if (line.startsWith("committer"))
-                fCommitter = Util.RemoveHead(line);
+                fCommitter = Util.RemoveHead(line); // FIXME time
         }
         fHash = hash;
         fMessage = message == null ? "" : message.toString();
@@ -54,6 +52,7 @@ public class GitCommit implements GitPackable {
         fParent = parent.fHash;
         fMessage = msg;
         fHash = null;
+        fTime = new Date();
     }
 
     public String GetMessage() {
@@ -82,6 +81,10 @@ public class GitCommit implements GitPackable {
         return fParent;
     }
 
+    public Date GetTime() {
+        return fTime;
+    }
+
     @Override
     public eType GetPackableType() {
         return eType.eType_Commit;
@@ -89,8 +92,7 @@ public class GitCommit implements GitPackable {
 
     @Override
     public byte[] GetPack() {
-        Date date = new Date();
-        String dateStr = (date.getTime() / 1000) +" " +(new SimpleDateFormat("Z", Locale.US).format(date));
+        String dateStr = (fTime.getTime() / 1000) +" " +(new SimpleDateFormat("Z", Locale.US).format(fTime));
         String data = "tree " +GitSha1.BytesToString(fTree.GetHash()) +"\n" +
                 "parent " +GetParent() +"\n" +
                 "author " +fAuthor +" " +dateStr +"\n" +
@@ -105,7 +107,7 @@ public class GitCommit implements GitPackable {
         private final GitCommit fParent;
         private final GitObject.GitTree fTree;
         private final ArrayDeque<File> fFilesToPush = new ArrayDeque<>();
-        private final HashMap<String, GitPackable> fToPack = new HashMap<>();
+        private final Set<String> fToPack = new TreeSet<>();
 
         public Builder(GitCommit parent, String author, String authorEmail, String message) {
             String aut = author +" <" +authorEmail +">";
@@ -116,6 +118,10 @@ public class GitCommit implements GitPackable {
 
         public GitCommit Build() {
             co.fTree = fTree;
+            for (GitPackable go: PreparePack()) {
+                if (go instanceof GitObject.GitTree)
+                    ((GitObject.GitTree) go).GetHash();
+            }
             return co;
         }
 
@@ -123,9 +129,9 @@ public class GitCommit implements GitPackable {
             fFilesToPush.add(f);
             GitObject obj = fTree.AddItem(relativeFilename, f);
             do {
-                fToPack.put(obj.GetGitPath(), obj);
+                fToPack.add(obj.GetGitPath());
                 obj = obj.GetParent();
-            } while (obj != null);
+            } while (obj != null && !"".equals(obj.fName));
             return this;
         }
 
@@ -134,15 +140,18 @@ public class GitCommit implements GitPackable {
             if (obj != null) {
                 GitObject.GitTree parent = obj.GetParent();
                 if (parent != null)
-                    parent.Remove(obj.GetHash());
+                    parent.Remove(obj.fName);
             }
             return this;
         }
 
         public SortedSet<GitPackable> PreparePack() {
             TreeSet packs = new TreeSet<GitPackable>(new GitPackableUtil.Comparator());
-            packs.add(Build());
-            packs.addAll(fToPack.values());
+            packs.add(co);
+            for (String i: fToPack)
+                packs.add(fTree.GetObjectFullPath(i));
+            if (!fToPack.isEmpty())
+                packs.add(fTree);
             return packs;
         }
     }

+ 16 - 15
app/src/main/java/info/knacki/pass/git/entities/GitObject.java

@@ -8,7 +8,6 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.SortedSet;
@@ -93,8 +92,8 @@ public abstract class GitObject implements Comparable<GitObject>, GitPackable {
             this(copy.fParent, copy.fMode, copy.fName, copy.fSha1);
             Initialize();
             for (Map.Entry<String, GitObject> o: copy.fItems.entrySet()) {
-                GitObject oCopy = o.getValue() instanceof GitTree ? new GitTree((GitTree) o.getValue()) : new GitBlob((GitBlob) o.getValue());
-                fItems.put(o.getKey(), oCopy);
+                GitObject src = o.getValue();
+                fItems.put(o.getKey(), src instanceof GitTree ? new GitTree((GitTree) src) : new GitBlob((GitBlob) src));
             }
         }
 
@@ -211,25 +210,19 @@ public abstract class GitObject implements Comparable<GitObject>, GitPackable {
                     fItems.put(filename, newItem);
                 }
             } else if (nextSlash == -1) {
-                Remove(obj.fSha1);
+                Remove(filename);
                 newItem = new GitBlob(this, filename, f);
                 fItems.put(filename, newItem);
             } else {
                 newItem = ((GitTree) obj).AddItem(path.substring(nextSlash + 1), f);
             }
-            fSha1 = GitSha1.getRawSha1OfPackable(this);
-            Logger.getAnonymousLogger().severe("New sha for " +GetGitPath()+ ": " +GitSha1.BytesToString(fSha1));
+            fSha1 = null;
             return newItem;
         }
 
-        public GitTree Remove(byte[] sha1) {
-            for (Map.Entry<String, GitObject> i: fItems.entrySet()) {
-                if (Arrays.equals(i.getValue().GetHash(), sha1)) {
-                    fItems.remove(i.getKey());
-                    break;
-                }
-            }
-            fSha1 = GitSha1.getRawSha1OfPackable(this);
+        public GitTree Remove(String filename) {
+            fItems.remove(filename);
+            fSha1 = null;
             return this;
         }
 
@@ -245,7 +238,8 @@ public abstract class GitObject implements Comparable<GitObject>, GitPackable {
             try {
                 for (GitObject go : GetObjects()) {
                     str.write((go.GetMode() + ' ').getBytes());
-                    Logger.getLogger(GitObject.class.getName()).severe("out file in tree " +go.GetGitPath() +"$" + GitSha1.BytesToString(go.GetHash()));
+                    if (go.fName.equals("Aa") || "Oo".equals(go.fName))
+                        Logger.getLogger(GitObject.class.getName()).severe("out file in tree " +go.GetGitPath() +"$" + GitSha1.BytesToString(go.GetHash()));
                     str.write(go.GetFilename().getBytes());
                     str.write(new byte[]{0});
                     str.write(go.GetHash());
@@ -254,6 +248,13 @@ public abstract class GitObject implements Comparable<GitObject>, GitPackable {
             catch (IOException e) {}
             return str.toByteArray();
         }
+
+        @Override
+        public byte[] GetHash() {
+            if (null != fSha1)
+                return fSha1;
+            return fSha1 = GitSha1.getRawSha1OfPackable(this);
+        }
     }
 
     private GitObject(GitTree parent, byte[] mode, String name, byte[] sha1) {

+ 5 - 15
app/src/main/java/info/knacki/pass/git/entities/GitPackableUtil.java

@@ -81,23 +81,13 @@ public class GitPackableUtil {
     public static class Comparator implements java.util.Comparator<GitPackable> {
         @Override
         public int compare(GitPackable t1, GitPackable t2) {
-            if (t1.GetPackableType() == GitPackable.eType.eType_Blob && t2.GetPackableType() != GitPackable.eType.eType_Blob)
-                return 1;
-            if (t1.GetPackableType() != GitPackable.eType.eType_Blob && t2.GetPackableType() == GitPackable.eType.eType_Blob)
-                return -1;
-            if (t1.GetPackableType() == GitPackable.eType.eType_Blob && t2.GetPackableType() == GitPackable.eType.eType_Blob)
-                return ((GitObject.GitBlob) t1).GetFilename().compareTo(((GitObject.GitBlob) t2).GetFilename());
-            if (t1.GetPackableType() == GitPackable.eType.eType_Tree && t2.GetPackableType() != GitPackable.eType.eType_Tree)
-                return 1;
-            if (t1.GetPackableType() != GitPackable.eType.eType_Tree && t2.GetPackableType() == GitPackable.eType.eType_Tree)
+            if (t1 instanceof GitObject && t2 instanceof GitObject)
+                return ((GitObject) t2).GetDepth() - ((GitObject) t1).GetDepth();
+            if (t1 instanceof GitObject && !(t2 instanceof GitObject))
                 return -1;
-            if (t1.GetPackableType() == GitPackable.eType.eType_Tree && t2.GetPackableType() == GitPackable.eType.eType_Tree)
-                return ((GitObject.GitTree) t1).GetDepth() -((GitObject.GitTree) t2).GetDepth();
-            if (t1.GetPackableType() == GitPackable.eType.eType_Commit)
+            if (!(t1 instanceof GitObject) && t2 instanceof GitObject)
                 return 1;
-            if (t2.GetPackableType() == GitPackable.eType.eType_Commit)
-                return -1;
-            return 0;
+            return (int)(((GitCommit)t1).GetTime().getTime() - ((GitCommit) t2).GetTime().getTime());
         }
     }
 }

+ 6 - 5
app/src/main/java/info/knacki/pass/ui/GitPullActivity.java

@@ -29,8 +29,7 @@ import info.knacki.pass.settings.SettingsManager;
 
 public class GitPullActivity extends AppCompatActivity {
     private final static Logger log = Logger.getLogger(GitPullActivity.class.getName());
-
-    public final static String COMMIT_MSG = "Coucou v2";//"Android pass sync";
+    public final static String COMMIT_MSG = "Android pass sync";
 
     private GitInterface fGitInterfage;
     private GitCommit fHeadCommit;
@@ -105,7 +104,7 @@ public class GitPullActivity extends AppCompatActivity {
 
         for (Map.Entry<String, GitObject.GitBlob>i: fHeadCommit.GetTree().FindAllBlobs().entrySet()) {
             String remoteLocalHash = localVersion.GetHash(i.getKey());
-            String currentHash = GitSha1.getSha1OfFile(PathUtils.GetPassDir(this), i.getKey());
+            String currentHash = GitSha1.BytesToString(GitSha1.getRawSha1OfFile(new File(PathUtils.GetPassDir(this) +i.getKey())));
 
             if (remoteLocalHash == null) remoteLocalHash = "";
 
@@ -125,8 +124,10 @@ public class GitPullActivity extends AppCompatActivity {
         }
         for (String i: localVersion.FileNames()) {
             if (fHeadCommit.GetTree().GetObjectFullPath(i) == null) {
-                log.severe("Cannot find obj on remote tree " +i);
-                final boolean localChanged = !GitSha1.getSha1OfFile(PathUtils.GetPassDir(this), i).equals(localVersion.GetHash(i));
+                log.finer("removed from remote " +i);
+                final String currentHash = GitSha1.BytesToString(GitSha1.getRawSha1OfFile(new File(PathUtils.GetPassDir(this) +i)));
+                final boolean localChanged = !currentHash.equals(localVersion.GetHash(i));
+
                 if (localChanged)
                     conflictingFiles.put(i, null);
                 else

+ 1 - 1
app/src/main/java/info/knacki/pass/ui/MainActivity.java

@@ -133,7 +133,7 @@ public class MainActivity extends AppCompatActivity implements PasswordClickList
 
         requestPermissions();
 
-        startActivity(new Intent(this, GitPullActivity.class));
+        //startActivity(new Intent(this, GitPullActivity.class));
     }
 
     @Override