On Wed, Mar 12, 2008 at 1:07 PM, Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> wrote: > Den Wednesday 12 March 2008 03.52.05 skrev Imran M Yousuf: > > > Maven: Does this mean mavenizing the project? If so I would start it > > this weekend. If you were referring to GIT Maven SCM please also let > > me know. > Not to build using, but create SCM functions for those so thay can use > git without <exec> tasks. Git isn't available in any of those, while much > worse SCM's have support. > I know a team who are currently working with the GIT SCM plugin for Maven; I think they are using CLI for the purpose. I am more interested in GIT VCS Module for NB6; as I have some other projects which will be using it :). > > > I am currently looking into .git/config format as Shawn suggested. > > That's a good one too. I have code for parsing the remotes specs, though > e.g. "+refs/heads/master/*:refs/remotes/origin/*", but nothing for the "branch" config. I haven't used it yet, so it's a rip-out. I will have a look at it; currently we have a long tasklist in a project; I will have a look at them as soon as I can make some time :). - Imran > > -- robin > > From 042fa0bef8b5d3ec8f5b1e385766ca61528e72aa Mon Sep 17 00:00:00 2001 > From: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> > Date: Wed, 5 Mar 2008 23:27:57 +0100 > Subject: [PATCH] Add support for parsing remote specs > > Signed-off-by: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> > --- > .../tst/org/spearce/jgit/lib/RemoteSpecTest.java | 95 +++++++++++++ > .../src/org/spearce/jgit/lib/RemoteSpec.java | 142 ++++++++++++++++++++ > .../src/org/spearce/jgit/lib/Repository.java | 12 ++ > 3 files changed, 249 insertions(+), 0 deletions(-) > create mode 100644 org.spearce.jgit.test/tst/org/spearce/jgit/lib/RemoteSpecTest.java > create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/RemoteSpec.java > > diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RemoteSpecTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RemoteSpecTest.java > new file mode 100644 > index 0000000..817e697 > --- /dev/null > +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RemoteSpecTest.java > @@ -0,0 +1,95 @@ > +/* > + * Copyright (C) 2007 Robin Rosenberg > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public > + * License, version 2, as published by the Free Software Foundation. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * You should have received a copy of the GNU General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > + */ > +package org.spearce.jgit.lib; > + > +import java.io.File; > +import java.io.FileOutputStream; > + > +/** > + * Test parsing of git remotes > + */ > +public class RemoteSpecTest extends RepositoryTestCase { > + > + /** > + * Test simplest case > + * > + * @throws Exception > + * > + */ > + public void testSimplestOk() throws Exception { > + RemoteSpec spec = new RemoteSpec("their", "git://foo.bar/zip.git", > + "refs/heads/master:refs/heads/origin",null); > + assertEquals("refs/heads/master", spec.getFetchRemoteRef()); > + assertEquals("refs/heads/origin", spec.getFetchLocalRef()); > + assertFalse(spec.isFetchMatchAny()); > + assertFalse(spec.isFetchOverwriteAlways()); > + } > + > + /** > + * Test a standard case > + * > + * @throws Exception > + */ > + public void testStandardOk() throws Exception { > + RemoteSpec spec = new RemoteSpec("their", "git://example.com/zip.git", > + "+refs/heads/master/*:refs/remotes/origin/*",null); > + assertEquals("git://example.com/zip.git", spec.getUrl()); > + assertEquals("refs/heads/master", spec.getFetchRemoteRef()); > + assertEquals("refs/remotes/origin", spec.getFetchLocalRef()); > + assertTrue(spec.isFetchMatchAny()); > + assertTrue(spec.isFetchOverwriteAlways()); > + } > + > + /** > + * Test a <quote>safer</quote> almost standard case > + * > + * @throws Exception > + */ > + public void testNonStandardSaferOk() throws Exception { > + RemoteSpec spec = new RemoteSpec("their", "git://example.com/zip.git", > + "refs/heads/master/*:refs/remotes/origin/*",null); > + assertEquals("git://example.com/zip.git", spec.getUrl()); > + assertEquals("refs/heads/master", spec.getFetchRemoteRef()); > + assertEquals("refs/remotes/origin", spec.getFetchLocalRef()); > + assertTrue(spec.isFetchMatchAny()); > + assertFalse(spec.isFetchOverwriteAlways()); > + } > + > + /** > + * Test a case copied from a real Git repo > + * > + * @throws Exception > + */ > + public void testReadFromConfig() throws Exception { > + File file = new File(db.getDirectory(),"config"); > + FileOutputStream stream = new FileOutputStream(file,true); > + try { > + stream.write(("[remote \"spearce\"]\n"+ > + "url = http://www.spearce.org/projects/scm/egit.git\n"+ > + "fetch = +refs/heads/*:refs/remotes/spearce/*\n").getBytes()); > + } finally { > + stream.close(); > + } > + db.getConfig().load(); > + RemoteSpec remoteSpec = db.getRemoteSpec("spearce"); > + assertEquals("http://www.spearce.org/projects/scm/egit.git", remoteSpec.getUrl()); > + assertEquals("refs/heads", remoteSpec.getFetchRemoteRef()); > + assertEquals("refs/remotes/spearce", remoteSpec.getFetchLocalRef()); > + assertTrue(remoteSpec.isFetchMatchAny()); > + assertTrue(remoteSpec.isFetchOverwriteAlways()); > + } > +} > diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RemoteSpec.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RemoteSpec.java > new file mode 100644 > index 0000000..a6a3b6c > --- /dev/null > +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RemoteSpec.java > @@ -0,0 +1,142 @@ > +/* > + * Copyright (C) 2007 Robin Rosenberg > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public > + * License, version 2, as published by the Free Software Foundation. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * You should have received a copy of the GNU General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > + */ > +package org.spearce.jgit.lib; > + > +/** > + * Information about how to synchronize with a remote Git repository. > + * > + * A remote is stored in the <GIT_DIR>/config as > + * > + * <pre> > + * [remote "name"] > + * url = URL:ish > + * fetch = [+]remoteref:localref > + * </pre> > + * > + * There are more variants but we do not support them here yet. > + */ > +public class RemoteSpec { > + > + static class Info { > + boolean overwriteAlways; > + > + boolean matchAny; > + > + String remoteRef; > + > + String localRef; > + } > + > + Info fetch = new Info(); > + > + Info push = null; > + > + private final String name; > + > + private final String url; > + > + /** > + * @return name of remote. This is a local short identifier > + */ > + public String getName() { > + return name; > + } > + > + /** > + * @return the URL:ish location of the remote Git repository > + */ > + public String getUrl() { > + return url; > + } > + > + /** > + * @return the local ref part used for fetch heads info > + */ > + public String getFetchLocalRef() { > + return fetch.localRef; > + } > + > + /** > + * @return the remote ref part used for fetching refs from the remote repo > + */ > + public String getFetchRemoteRef() { > + return fetch.remoteRef; > + } > + > + /** > + * @return whether the fetch matches all branches under the ref or just the > + * named ref > + */ > + public boolean isFetchMatchAny() { > + return fetch.matchAny; > + } > + > + /** > + * @return whether the tracking branch is always updated, or only when the > + * update is a fast forward > + */ > + public boolean isFetchOverwriteAlways() { > + return fetch.overwriteAlways; > + } > + > + /** > + * Create a representation of a git remote specification. > + * > + * @param name A local short identifier > + * @param url The URL:ish used for fetching / pushing > + * @param fetchPattern refspec for fetching > + * @param pushPattern refspec for pushing or null > + */ > + public RemoteSpec(String name, String url, String fetchPattern, > + String pushPattern) { > + this.name = name; > + this.url = url; > + parse(fetchPattern, fetch); > + if (pushPattern != null) { > + push = new Info(); > + parse(pushPattern, push); > + } > + } > + > + private void parse(String fetchSpec, Info info) { > + int p = 0; > + if (fetchSpec.charAt(p) == '+') { > + info.overwriteAlways = true; > + ++p; > + } > + int cp = fetchSpec.indexOf(':'); > + if (cp < 0) > + throw new IllegalArgumentException("Bad remote format " + fetchSpec); > + info.remoteRef = fetchSpec.substring(p, cp); > + info.localRef = fetchSpec.substring(cp + 1); > + if (info.remoteRef.endsWith("/*")) { > + info.matchAny = true; > + info.remoteRef = info.remoteRef.substring(0, info.remoteRef > + .length() - 2); > + } > + if (info.localRef.endsWith("/*")) { > + if (!info.matchAny) > + throw new IllegalArgumentException("Bad remote format " > + + fetchSpec); > + info.localRef = info.localRef.substring(0, > + info.localRef.length() - 2); > + } else > + if (info.matchAny) > + throw new IllegalArgumentException("Bad remote format " + fetchSpec); > + > + } > +} > diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java > index b3fa12e..821633d 100644 > --- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java > +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java > @@ -1132,4 +1132,16 @@ public class Repository { > relName = relName.replace(File.separatorChar, '/'); > return relName; > } > + > + /** > + * @param name > + * The "remote" name in this repo > + * @return information about how a remote repository is beging tracked > + */ > + public RemoteSpec getRemoteSpec(String name) { > + String url = getConfig().getString("remote."+name, null, "url"); > + String fetchPattern = getConfig().getString("remote."+name, null, "fetch"); > + String pushPattern = getConfig().getString("remote."+name, null, "push"); > + return new RemoteSpec(name, url, fetchPattern, pushPattern); > + } > } > -- > 1.5.4.3 > > -- Imran M Yousuf Entrepreneur & Software Engineer Smart IT Engineering Dhaka, Bangladesh Email: imran@xxxxxxxxxxxxxxxxxxxxxx Mobile: +880-1711402557 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html