* Re: [PATCH v2] git-send-email.perl: fold multiple entry "Cc:" and multiple single line "RCPT TO:"s
From: Junio C Hamano @ 2009-10-10 0:57 UTC (permalink / raw)
To: Joe Perches; +Cc: git, Jay Soffian
In-Reply-To: <1255021406.2056.122.camel@Joe-Laptop.home>
This breaks t9001 since it expects an old (and probably incorrect) RCPT TO:
lines. I fixed them up.
^ permalink raw reply
* Re: [PATCH 1/2] t/test-lib.sh: support Korn shell by converting GIT_EXIT_OK to GIT_EXIT_CODE
From: Junio C Hamano @ 2009-10-10 0:57 UTC (permalink / raw)
To: Brandon Casey; +Cc: Brandon Casey, git, drizzd, peff
In-Reply-To: <ee63ef30910091537i40a8cc68y2513f07c91fb35b@mail.gmail.com>
Brandon Casey <drafnel@gmail.com> writes:
> I'm away from a computer right now. Junio, if gmail is showing me the
> entirety of your workaround, then no, I don't think that will work.
> Your code will always exit non-zero, but there are cases where 'exit
> 0' is called and a '0' exit status is desired. e.g. when test_done is
> called.
Ah, of course you are right.
^ permalink raw reply
* Re: [PATCH 7/9] Documentation: clarify branch creation
From: Junio C Hamano @ 2009-10-10 0:57 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: Sean Estabrooks, git
In-Reply-To: <20091009183408.GB2477@progeny.tock>
Jonathan Nieder <jrnieder@gmail.com> writes:
> So this page should probably point to the what-is-a-branch section of
> the User's Manual. Maybe something like this?
Sounds good. Thanks
> -- %< --
> Subject: Documentation: clarify branch creation
>
> The documentation seems to assume that the starting point for a new
> branch is the tip of an existing (ordinary) branch, but that is not
> the most common case. More often, "git branch" is used to begin
> a branch from a remote-tracking branch, a tag, or an interesting
> commit (e.g. origin/pu^2). Clarify the language so it can apply
> to these cases. Thanks to Sean Estabrooks for the wording.
>
> Also add a pointer to the user's manual for the bewildered.
> ...
^ permalink raw reply
* Re: [PATCH] Speedup bash completion loading
From: Junio C Hamano @ 2009-10-10 0:57 UTC (permalink / raw)
To: Shawn O. Pearce; +Cc: Kirill Smelkov, Ted Pavlic, git
In-Reply-To: <20091009161443.GX9261@spearce.org>
Thanks for this, and all the other acks and patches.
^ permalink raw reply
* Re: [PATCH 0/9] Documentation tweaks
From: Junio C Hamano @ 2009-10-10 0:58 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: git
In-Reply-To: <20091009101400.GA16549@progeny.tock>
Jonathan Nieder <jrnieder@gmail.com> writes:
> Here are some small documentation patches that have been sitting in
> my tree for a while. Most important is the first one, which makes it
> easier to find the appropriate options for building documentation
> from source on a new machine.
Thanks.
^ permalink raw reply
* Re: [PATCH] git-svn: hide find_parent_branch output in double quiet mode
From: Eric Wong @ 2009-10-10 1:08 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Simon Arlott
In-Reply-To: <b01cac406b93d5c67e3ae2e9a7aaa498a52dd9fc@8b5064a13e22126c1b9329f0dc35b8915774b7c3.invalid>
Simon Arlott <simon@fire.lp0.eu> wrote:
> Hide find_parent_branch logging when -qq is specified.
> This eliminates more unnecessary output when run from cron, e.g.:
>
> Found possible branch point:
> http://undernet-ircu.svn.sourceforge.net/svnroot/undernet-ircu/ircu2/trunk =>
> http://undernet-ircu.svn.sourceforge.net/svnroot/undernet-ircu/ircu2/branches/authz,
> 1919
> Found branch parent: (authz) ea061d76aea985dc0208d36fa5e0b2249b698557
> Following parent with do_switch
> Successfully followed parent
>
> Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Thanks Simon,
Acked-by: Eric Wong <normalperson@yhbt.net>
and pushed out to git://git.bogomips.org/git-svn
--
Eric Wong
^ permalink raw reply
* git svn with non-standard svn layout
From: Fabian Molder @ 2009-10-09 22:24 UTC (permalink / raw)
To: git
Hello,
- want to use git inside an huge SVN project
--> so git-svn could do the job ..
- I struggle with two things:
A) - the SVN project has an non-standard layout
B) - want to have (several) git's for just the (few) peaces I work on
for A)
======
- svn layout looks like this (simplified):
- trunk (not really used, all interesting work in branches)
- branches
- r1.2
- development
- integration
- r1.3
- development
- integration
...
- inside development and integration is:
- xapplication1
- xapplication2
- xapplication3
...
- aa
-bb
-cc
- zapplication1
- zapplication2
- zapplication3
...
- I created an simplified svn test (from scratch; import/repo/workdir)
via this bash-script: http://pastebin.ca/1608231
for B)
======
- the svn repo is very huge, but I'm only interested in these dirs:
xapplication2/
aa/bb/cc/zapplication1
- my objectives:
- have several local git's, just the ones I need:
--> xapplication2/.git
--> aa/bb/cc/zapplication1/.git
I tried to use "git config svn-remote.svn.branches" to do this,
please see in function "do_git_svn" in bash-script - but no success
any hints appreciated
regards,
Fabian
^ permalink raw reply
* Re: [PATCH] git-svn: hide find_parent_branch output in double quiet mode
From: Junio C Hamano @ 2009-10-10 7:02 UTC (permalink / raw)
To: Eric Wong; +Cc: git, Simon Arlott
In-Reply-To: <20091010010843.GA30258@dcvr.yhbt.net>
Eric Wong <normalperson@yhbt.net> writes:
> Thanks Simon,
>
> Acked-by: Eric Wong <normalperson@yhbt.net>
>
> and pushed out to git://git.bogomips.org/git-svn
Thanks; you seem to have rebased the history in this repository, and
merging from you will duplicate Alexander's "Avoid spurious errors", which
I already pulled, so I'll cherry pick this one from your tree.
^ permalink raw reply
* Re: Merging non-git releases of a project
From: Peter Baumann @ 2009-10-10 8:47 UTC (permalink / raw)
To: Avery Pennarun; +Cc: Howard Miller, git
In-Reply-To: <32541b130910091543x19b3b46an109f90be5c5bfaa2@mail.gmail.com>
On Fri, Oct 09, 2009 at 06:43:50PM -0400, Avery Pennarun wrote:
> On Fri, Oct 9, 2009 at 5:33 PM, Howard Miller
> <howard@e-learndesign.co.uk> wrote:
> > I'm missing the point here though. Where/when do I actually add the
> > new pristine code? If I checkout, as you suggest, my initial commit I
> > just have (say) v1.0 of the vendor's code. I can't just copy (say)
> > version 1.2 on top as the files probably won't match one-one.
> >
> > Sorry - I'm probably completely failing to understand.
>
> Try this:
>
> cd mygitproject
> git rm -rf .
> cp -a /tmp/wherever/vendor-1.2/. .
> git add .
This won't commit deleted files from v1.0 - v1.2. Use git add -A to stage all
modified and deleted files for the next commit.
> git commit
>
> Don't worry, git won't double-store files that are identical between
> the old 1.0 and new 1.2 versions.
^ permalink raw reply
* Re: Merging non-git releases of a project
From: Howard Miller @ 2009-10-10 8:58 UTC (permalink / raw)
To: Avery Pennarun; +Cc: git
In-Reply-To: <32541b130910091543x19b3b46an109f90be5c5bfaa2@mail.gmail.com>
2009/10/9 Avery Pennarun <apenwarr@gmail.com>:
> On Fri, Oct 9, 2009 at 5:33 PM, Howard Miller
> <howard@e-learndesign.co.uk> wrote:
>> I'm missing the point here though. Where/when do I actually add the
>> new pristine code? If I checkout, as you suggest, my initial commit I
>> just have (say) v1.0 of the vendor's code. I can't just copy (say)
>> version 1.2 on top as the files probably won't match one-one.
>>
>> Sorry - I'm probably completely failing to understand.
>
> Try this:
>
> cd mygitproject
> git rm -rf .
> cp -a /tmp/wherever/vendor-1.2/. .
> git add .
> git commit
>
> Don't worry, git won't double-store files that are identical between
> the old 1.0 and new 1.2 versions.
>
> Avery
>
Adding Unix ignorance to git ignorance... doesn't that delete the .git
directory too?
I don't have cp -a (on a mac) but, IIRC, that's just -rp or somesuch?
But I see, basic idea is to ditch the files, replace them with the new
vendor release a commit. I did think of that but it seemed too simple
:-)
Cheers.
^ permalink raw reply
* Re: Merging non-git releases of a project
From: Björn Steinbrink @ 2009-10-10 9:00 UTC (permalink / raw)
To: Peter Baumann; +Cc: Avery Pennarun, Howard Miller, git
In-Reply-To: <20091010084742.GB17220@m62s10.vlinux.de>
On 2009.10.10 10:47:42 +0200, Peter Baumann wrote:
> On Fri, Oct 09, 2009 at 06:43:50PM -0400, Avery Pennarun wrote:
> > Try this:
> >
> > cd mygitproject
> > git rm -rf .
> > cp -a /tmp/wherever/vendor-1.2/. .
> > git add .
>
> This won't commit deleted files from v1.0 - v1.2. Use git add -A to stage all
> modified and deleted files for the next commit.
It will, the "git rm" already cleans the index.
Björn
^ permalink raw reply
* git-svn very slow on fetch (shared git-svn repo)
From: Pascal Obry @ 2009-10-10 9:10 UTC (permalink / raw)
To: git list
Here is the problem.
Doing a:
$ git svn fetch
Takes age to update the repository. The long story is that I'm trying to
have shared git-svn repositories.
I'm cloning the repository on a server using a standard "git svn clone".
I then let users cloning this repository using the procedure described
in git-svn help. Copy/paste here:
<<
# Do the initial import on a server
ssh server "cd /pub && git svn clone
http://svn.example.com/project
# Clone locally - make sure the refs/remotes/ space matches the
server
mkdir project
cd project
git init
git remote add origin server:/pub/project
git config --add remote.origin.fetch
'+refs/remotes/*:refs/remotes/*'
git fetch
# Create a local branch from one of the branches just fetched
git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and
-T/-b/-t options as were used on server)
git svn init http://svn.example.com/project
# Pull the latest changes from Subversion
git svn rebase
>>
If you do a "git svn fetch" (to get new branches) it takes age if you
have imported branches that are not used since a long time.
I've traced this down to the Perl fetch_all procedure. It seems that the
fetch is looking at the older version in all branches and then read the
remote repository starting from this revision. As some branches are
unused since a very long it it re-read most of the history. In my
example it start at rev 8200 whereas the last revision on trunk is
150000 (I put trace in git-svn Perl script).
I have observed that this happen only the first time.
This can be confirmed by the fact that if you break git-svn fetch
process and restart it it will start to a later revision. So it seems
that git-svn is keeping some kind of data about what has already been
fetched but those data are not properly copied by the procedure above.
Is there a workaround that? Where are those data stored?
Any guidance would be very welcomed.
Thanks,
Pascal.
--
--|------------------------------------------------------
--| Pascal Obry Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--| http://www.obry.net - http://v2p.fr.eu.org
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver keys.gnupg.net --recv-key F949BD3B
^ permalink raw reply
* Re: Merging non-git releases of a project
From: Peter Baumann @ 2009-10-10 10:04 UTC (permalink / raw)
To: Björn Steinbrink; +Cc: Avery Pennarun, Howard Miller, git
In-Reply-To: <20091010090053.GA4843@atjola.homenet>
On Sat, Oct 10, 2009 at 11:00:53AM +0200, Björn Steinbrink wrote:
> On 2009.10.10 10:47:42 +0200, Peter Baumann wrote:
> > On Fri, Oct 09, 2009 at 06:43:50PM -0400, Avery Pennarun wrote:
> > > Try this:
> > >
> > > cd mygitproject
> > > git rm -rf .
> > > cp -a /tmp/wherever/vendor-1.2/. .
> > > git add .
> >
> > This won't commit deleted files from v1.0 - v1.2. Use git add -A to stage all
> > modified and deleted files for the next commit.
>
> It will, the "git rm" already cleans the index.
>
You are right. I missed the "git" part and read only rm -rf.
-Peter
^ permalink raw reply
* Re: [RFC PATCH 1/4] Document the HTTP transport protocol
From: Antti-Juhani Kaijanaho @ 2009-10-10 10:12 UTC (permalink / raw)
To: git
In-Reply-To: <7vskdss3ei.fsf@alter.siamese.dyndns.org>
On 2009-10-09, Junio C Hamano <gitster@pobox.com> wrote:
>> +If there is no repository at $GIT_URL, the server MUST respond with
>> +the '404 Not Found' HTTP status code.
>
> We may also want to add
>
> If there is no object at $GIT_URL/some/path, the server MUST respond
> with the '404 Not Found' HTTP status code.
>
> to help dumb clients.
In both cases - is it really necessary to forbid the use of 410 (Gone)?
--
Mr. Antti-Juhani Kaijanaho, Jyvaskyla, Finland
^ permalink raw reply
* Re: Git 1.6.5-rc git clone unhandled exception using http protocol
From: Tay Ray Chuan @ 2009-10-10 10:55 UTC (permalink / raw)
To: eduard stefan; +Cc: Git Mailing List
In-Reply-To: <4ACF7296.3010809@gmail.com>
Hi,
On Sat, Oct 10, 2009 at 1:27 AM, eduard stefan <eduard.stefan@gmail.com> wrote:
> How can I obtain more information about the error?
How are you executing the git commands? From the windows command line?
From the msys bash shell? Could you copy and paste the output of git
when cloning the repo?
How about the win32 exception? What does it say? Does it display as a dialog?
--
Cheers,
Ray Chuan
^ permalink raw reply
* Re: [PATCH 1/2] t/test-lib.sh: support Korn shell by converting GIT_EXIT_OK to GIT_EXIT_CODE
From: Clemens Buchacher @ 2009-10-10 12:01 UTC (permalink / raw)
To: Brandon Casey; +Cc: git, peff, Brandon Casey
In-Reply-To: <1eweIwf5YoFwmLPWwEFN69a2f-EUnj_kgiagVJoVQYfNQeLjlpm12U84RKxhzjh0NJv36SqO12lAX2c_x0WSgA@cipher.nrlssc.navy.mil>
Hi,
On Fri, Oct 09, 2009 at 01:39:56PM -0500, Brandon Casey wrote:
> For the Korn shell, $? has the value of the last executed statement
> _before_ the call to exit.
I just installed ksh/stable (version 93s+ 2008-01-31) on Debian and it
behaves correctly. Maybe you need to upgrade? This really looks like a bug
in your shell to me.
> die () {
> code=$?
> - if test -n "$GIT_EXIT_OK"
> + if test -n "$GIT_EXIT_CODE"
> then
> - exit $code
> + exit $GIT_EXIT_CODE
> else
> echo >&5 "FATAL: Unexpected exit with code $code"
> exit 1
> fi
> }
So in your shell an unexpected exit will always output this?
FATAL: Unexpected exit with code <some command>
If we can't rely on the value of $?, we should not use it.
Clemens
^ permalink raw reply
* Re: [RFC PATCH 1/4] Document the HTTP transport protocol
From: Tay Ray Chuan @ 2009-10-10 12:17 UTC (permalink / raw)
To: Shawn O. Pearce; +Cc: git
In-Reply-To: <1255065768-10428-2-git-send-email-spearce@spearce.org>
Hi,
On Fri, Oct 9, 2009 at 1:22 PM, Shawn O. Pearce <spearce@spearce.org> wrote:
> +Smart Clients
> +~~~~~~~~~~~~~
> +
> +HTTP clients that support the "smart" protocol (or both the
> +"smart" and "dumb" protocols) MUST discover references by making
> +a paramterized request for the info/refs file of the repository.
s/paramterized/parameterized/ -- missing 'e'.
--
Cheers,
Ray Chuan
^ permalink raw reply
* Re: [PATCH 1/2] t/test-lib.sh: support Korn shell by converting GIT_EXIT_OK to GIT_EXIT_CODE
From: Andreas Schwab @ 2009-10-10 12:24 UTC (permalink / raw)
To: Clemens Buchacher; +Cc: Brandon Casey, git, peff, Brandon Casey
In-Reply-To: <20091010120121.GA16336@localhost>
Clemens Buchacher <drizzd@aon.at> writes:
> Hi,
>
> On Fri, Oct 09, 2009 at 01:39:56PM -0500, Brandon Casey wrote:
>
>> For the Korn shell, $? has the value of the last executed statement
>> _before_ the call to exit.
>
> I just installed ksh/stable (version 93s+ 2008-01-31) on Debian and it
> behaves correctly. Maybe you need to upgrade? This really looks like a bug
> in your shell to me.
According to the autoconf docs this bug is also present in the Solaris
/bin/sh (and autoconf generated scripts use some elaborated workaround).
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply
* Re: [PATCH 1/2] t/test-lib.sh: support Korn shell by converting GIT_EXIT_OK to GIT_EXIT_CODE
From: Ben Walton @ 2009-10-10 12:53 UTC (permalink / raw)
To: Andreas Schwab; +Cc: GIT List
In-Reply-To: <m2eipbphbr.fsf@igel.home>
[-- Attachment #1: Type: text/plain, Size: 1159 bytes --]
Excerpts from Andreas Schwab's message of Sat Oct 10 08:24:40 -0400 2009:
> According to the autoconf docs this bug is also present in the Solaris
> /bin/sh (and autoconf generated scripts use some elaborated workaround).
Solaris' /bin/sh shouldn't be used for anything but forking a decent
shell, imo. It was brought to my attention recently that the test
suite for mercurial on solaris was failing the git tests. The
mercurial folks initially thought this was a git on solaris bug.
After looking into it, I discovered that ^ is still treated[1] as a
pipe symbol[2] in some cases. So, test suite programs run under
/bin/sh on solaris with commands like `git reset --hard HEAD^` were
misbehaving due to the shell setting up a pipeline under the right
circumstances.
-Ben
[1] http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/cmd.c
line 184
[2] This dates back to the Thomson shell:
http://en.wikipedia.org/wiki/Thompson_shell
--
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302
GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* Re: [PATCH 1/2] t/test-lib.sh: support Korn shell by converting GIT_EXIT_OK to GIT_EXIT_CODE
From: Jeff King @ 2009-10-10 14:03 UTC (permalink / raw)
To: Ben Walton; +Cc: Andreas Schwab, GIT List
In-Reply-To: <1255178966-sup-5813@ntdws12.chass.utoronto.ca>
On Sat, Oct 10, 2009 at 08:53:00AM -0400, Ben Walton wrote:
> > According to the autoconf docs this bug is also present in the Solaris
> > /bin/sh (and autoconf generated scripts use some elaborated workaround).
>
> Solaris' /bin/sh shouldn't be used for anything but forking a decent
> shell, imo. It was brought to my attention recently that the test
> suite for mercurial on solaris was failing the git tests. The
> mercurial folks initially thought this was a git on solaris bug.
Yes, that is the attitude we take towards /bin/sh on Solaris. Most
people running git on Solaris (or other broken-shell platforms) point
SHELL_PATH to bash. I think the point of Brandon's patch is to let them
use a native shell.
So while /bin/sh is broken, the question is whether the alternate native
shell is broken enough to use or not.
-Peff
^ permalink raw reply
* Re: combine git repo historically
From: bill lam @ 2009-10-10 14:03 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git, Christian Couder
In-Reply-To: <4ACED204.3000907@viscovery.net>
On Fri, 09 Oct 2009, Johannes Sixt wrote:
> bill lam schrieb:
> > I have two git repos, no branches.
> >
> > repo 1.
> > emptyrootcommit -- A ... M
> >
> > repo 2.
> > emptyrootcommit -- N ... Z
> >
> > N was evolved from M but the time gap is large, how can I combine them
> > into one repo
> >
> > emptyrootcommit -- A ... M -- N ... Z
> >
> > so that snapshots N .. Z will not be changed.
>
> $ echo $(git rev-parse N) $(git rev-parse M) >> .git/info/grafts
> $ git filter-branch --tag-name-filter cat -- --all --not M
>
> i.e. you graft the older history right before the younger history, then
> you use git filter-branch to rewrite the parentship of the younger commits.
Thanks, graft is new to me. I tested it works but it needs first issue
git fetch /path/to/repo1
within repo2 to fetch tip M from repo1 into repo2, is it correct?
If I also want to fetch also all objects from repo1, what will the
command to do it.
Christian Couder also mentioned the git-replace command, how to stitch
with it?
--
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
^ permalink raw reply
* Re: Git 1.6.5-rc git clone unhandled exception using http protocol
From: eduard stefan @ 2009-10-10 15:55 UTC (permalink / raw)
To: Tay Ray Chuan; +Cc: Git Mailing List
In-Reply-To: <be6fef0d0910100811l325d3df1jdf8d3d9dd51e3385@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 720 bytes --]
Tay Ray Chuan wrote:
> Hi,
>
> On Sat, Oct 10, 2009 at 10:51 PM, eduard stefan <eduard.stefan@gmail.com> wrote:
>> I attached three screenshots of the msys shell,
>> it doesn't matter what url is used,
>> and git remote-curl doesn't crash when run in a non-git repository,
>> but as soon as I create an empty repo, it crashes just like git clone http://...
>
> that's not how you use remote-curl.
>
> Cloning a bogus repository (http://test.com/sample.git) isn't a good idea too.
I was just trying to point that the URL used is not relevant,
as long as the protocol used is URL, then it crashes.
> Could you show me the screenshot of you cloning
> http://github.com/loudej/spark.git?
Done.
Have a nice day,
A.
[-- Attachment #2: git-clone-1.png --]
[-- Type: image/png, Size: 15141 bytes --]
[-- Attachment #3: git-clone-2.png --]
[-- Type: image/png, Size: 17283 bytes --]
^ permalink raw reply
* [JGit-RFC-PATCH 1/3] Introduce a new module for IO SPI of JGit
From: imyousuf @ 2009-10-10 15:56 UTC (permalink / raw)
To: git; +Cc: spearce, egit-dev, Imran M Yousuf
From: Imran M Yousuf <imyousuf@smartitengineering.com>
The reason for having a separate module is quite obvious, the IO SPI
providers need not have to depend on the whole JGit but rather only on
the SPI itself. As of the initial implementation the SPI will also contain
the default implementation - local file system provider.
Extract maven POM file to a common file to encapsulate the common setting
and configuration to be used across all maven modules for JGit.
Signed-off-by: Imran M Yousuf <imyousuf@smartitengineering.com>
---
jgit-maven/jgit-io/pom.xml | 65 +++++++++
jgit-maven/jgit/pom.xml | 287 ++++++++++-------------------------------
jgit-maven/{jgit => }/pom.xml | 31 +----
3 files changed, 143 insertions(+), 240 deletions(-)
create mode 100644 jgit-maven/jgit-io/pom.xml
rewrite jgit-maven/jgit/pom.xml (68%)
rename jgit-maven/{jgit => }/pom.xml (90%)
diff --git a/jgit-maven/jgit-io/pom.xml b/jgit-maven/jgit-io/pom.xml
new file mode 100644
index 0000000..f197f58
--- /dev/null
+++ b/jgit-maven/jgit-io/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+All rights reserved.
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the following
+conditions are met:
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following
+disclaimer in the documentation and/or other materials provided
+with the distribution.
+
+Neither the name of the Eclipse Foundation, Inc. nor the
+names of its contributors may be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse</groupId>
+ <artifactId>jgit-parent</artifactId>
+ <version>0.6.0-SNAPSHOT</version>
+ </parent>
+ <groupId>org.eclipse</groupId>
+ <artifactId>jgit-io</artifactId>
+ <packaging>jar</packaging>
+ <name>jgit-io</name>
+ <build>
+ <sourceDirectory>../../org.eclipse.jgit.io/src/</sourceDirectory>
+ <testResources>
+ <testResource>
+ <directory>../../org.eclipse.jgit.test/tst-rsrc/</directory>
+ </testResource>
+ </testResources>
+ <testSourceDirectory>../../org.eclipse.jgit.io/tst/</testSourceDirectory>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/jgit-maven/jgit/pom.xml b/jgit-maven/jgit/pom.xml
dissimilarity index 68%
index d8772ad..9eb5758 100644
--- a/jgit-maven/jgit/pom.xml
+++ b/jgit-maven/jgit/pom.xml
@@ -1,216 +1,71 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-All rights reserved.
-Redistribution and use in source and binary forms, with or
-without modification, are permitted provided that the following
-conditions are met:
-
-Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials provided
-with the distribution.
-
-Neither the name of the Eclipse Foundation, Inc. nor the
-names of its contributors may be used to endorse or promote
-products derived from this software without specific prior
-written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.eclipse</groupId>
- <artifactId>jgit</artifactId>
- <packaging>jar</packaging>
- <version>0.6.0-SNAPSHOT</version>
- <name>jgit</name>
- <url>http://repo.or.cz/w/jgit.git</url>
- <mailingLists>
- <mailingList>
- <name>GIT Mailing List</name>
- <post>git@vger.kernel.org</post>
- <archive>http://marc.info/?l=git</archive>
- </mailingList>
- </mailingLists>
- <description>Pure Java implementation of Git</description>
- <developers>
- <developer>
- <name>Shawn O. Pearce</name>
- <email>spearce@spearce.org</email>
- <roles>
- <role>Maintainer</role>
- </roles>
- </developer>
- <developer>
- <name>Robin Rosenberg</name>
- <email>robin.rosenberg@dewire.com</email>
- <roles>
- <role>Maintainer</role>
- </roles>
- </developer>
- <developer>
- <name>Dave Watson</name>
- <email>dwatson@mimvista.com</email>
- <roles>
- <role>Developer</role>
- </roles>
- </developer>
- <developer>
- <name>Roger C. Soares</name>
- <email>rogersoares@intelinet.com.br</email>
- <roles>
- <role>Developer</role>
- </roles>
- </developer>
- <developer>
- <name>Marek Zawirski</name>
- <email>marek.zawirski@gmail.com</email>
- <roles>
- <role>Developer</role>
- </roles>
- </developer>
- <developer>
- <name>Charles O'Farrell</name>
- <email>charleso@charleso.org</email>
- <roles>
- <role>Contributor</role>
- </roles>
- </developer>
- <developer>
- <name>Imran M Yousuf</name>
- <email>imyousuf@smartitengineering.com</email>
- <organization>Smart IT Engineering</organization>
- <roles>
- <role>Contributor</role>
- </roles>
- </developer>
- </developers>
- <licenses>
- <license>
- <name>Eclipse Distribution License (New BSD License)</name>
- <comments>
- All rights reserved.
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- Neither the name of the Eclipse Foundation, Inc. nor the
- names of its contributors may be used to endorse or promote
- products derived from this software without specific prior
- written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- </comments>
- </license>
- </licenses>
- <build>
- <sourceDirectory>../../org.eclipse.jgit/src/</sourceDirectory>
- <testResources>
- <testResource>
- <directory>../../org.eclipse.jgit.test/tst-rsrc/</directory>
- </testResource>
- </testResources>
- <testSourceDirectory>../../org.eclipse.jgit.test/tst/</testSourceDirectory>
- <plugins>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.0.2</version>
- <configuration>
- <source>1.5</source>
- <target>1.5</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.4.2</version>
- <configuration>
- <includes>
- <include>**/*Test.java</include>
- <include>**/*TestCase.java</include>
- <include>**/T000*.java</include>
- </includes>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-source-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-javadoc-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.jcraft</groupId>
- <artifactId>jsch</artifactId>
- <version>0.1.41</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
- <distributionManagement>
- <snapshotRepository>
- <id>jgit-maven-snapshot-repository</id>
- <name>JGit Maven Snapshot Repository</name>
- <url>dav:https://egit.googlecode.com/svn/maven/snapshot-repository/</url>
- <uniqueVersion>true</uniqueVersion>
- </snapshotRepository>
- </distributionManagement>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+All rights reserved.
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the following
+conditions are met:
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following
+disclaimer in the documentation and/or other materials provided
+with the distribution.
+
+Neither the name of the Eclipse Foundation, Inc. nor the
+names of its contributors may be used to endorse or promote
+products derived from this software without specific prior
+written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse</groupId>
+ <artifactId>jgit-parent</artifactId>
+ <version>0.6.0-SNAPSHOT</version>
+ </parent>
+ <groupId>org.eclipse</groupId>
+ <artifactId>jgit</artifactId>
+ <packaging>jar</packaging>
+ <name>jgit</name>
+ <build>
+ <sourceDirectory>../../org.eclipse.jgit/src/</sourceDirectory>
+ <testResources>
+ <testResource>
+ <directory>../../org.eclipse.jgit.test/tst-rsrc/</directory>
+ </testResource>
+ </testResources>
+ <testSourceDirectory>../../org.eclipse.jgit.test/tst/</testSourceDirectory>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.jcraft</groupId>
+ <artifactId>jsch</artifactId>
+ <version>0.1.41</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/jgit-maven/jgit/pom.xml b/jgit-maven/pom.xml
similarity index 90%
rename from jgit-maven/jgit/pom.xml
rename to jgit-maven/pom.xml
index d8772ad..bac9629 100644
--- a/jgit-maven/jgit/pom.xml
+++ b/jgit-maven/pom.xml
@@ -37,10 +37,10 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse</groupId>
- <artifactId>jgit</artifactId>
- <packaging>jar</packaging>
+ <artifactId>jgit-parent</artifactId>
+ <packaging>pom</packaging>
<version>0.6.0-SNAPSHOT</version>
- <name>jgit</name>
+ <name>JGit</name>
<url>http://repo.or.cz/w/jgit.git</url>
<mailingLists>
<mailingList>
@@ -141,13 +141,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</license>
</licenses>
<build>
- <sourceDirectory>../../org.eclipse.jgit/src/</sourceDirectory>
- <testResources>
- <testResource>
- <directory>../../org.eclipse.jgit.test/tst-rsrc/</directory>
- </testResource>
- </testResources>
- <testSourceDirectory>../../org.eclipse.jgit.test/tst/</testSourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
@@ -191,20 +184,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</plugin>
</plugins>
</build>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.jcraft</groupId>
- <artifactId>jsch</artifactId>
- <version>0.1.41</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
<distributionManagement>
<snapshotRepository>
<id>jgit-maven-snapshot-repository</id>
@@ -213,4 +192,8 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
</distributionManagement>
+ <modules>
+ <module>jgit</module>
+ <module>jgit-io</module>
+ </modules>
</project>
--
1.6.2.1
^ permalink raw reply related
* [JGit-RFC-PATCH 3/3] Incorporate current FileSystem Util implementations to the SPI
From: imyousuf @ 2009-10-10 15:57 UTC (permalink / raw)
To: git; +Cc: spearce, egit-dev, Imran M Yousuf
In-Reply-To: <1255190221-19428-2-git-send-email-imyousuf@gmail.com>
From: Imran M Yousuf <imyousuf@smartitengineering.com>
Operations such as setting executable bits if supported and resolving
relative path is incorporated with this change, as a result now it should
be possible to completely replace the currently being used util FS and
java.io.File.
Signed-off-by: Imran M Yousuf <imyousuf@smartitengineering.com>
---
.../src/org/eclipse/jgit/io/Entry.java | 35 ++++-
.../src/org/eclipse/jgit/io/StorageSystem.java | 17 ++-
.../eclipse/jgit/io/localfs/LocalFileEntry.java | 52 ++++++-
.../eclipse/jgit/io/localfs/LocalFileSystem.java | 162 +++++++++++++++++++-
4 files changed, 259 insertions(+), 7 deletions(-)
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
index b8c3236..67d2af5 100644
--- a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
@@ -78,6 +78,24 @@
public boolean isExists();
/**
+ * Does this operating system and JRE support the execute flag on entries?
+ *
+ * @return true if this implementation can provide reasonably accurate
+ * executable bit information; false otherwise.
+ */
+ public boolean isExecutableSupported();
+
+ /**
+ * Determine if the entry is executable (or not).
+ * <p>
+ * Not all platforms and JREs support executable flags on entries. If the
+ * feature is unsupported this method will always return false.
+ *
+ * @return true if the entry is believed to be executable by the user.
+ */
+ public boolean isExecutable();
+
+ /**
* Make directories upto the entry represented by this instance, provided
* that this instance itself is a directory.
* @return True if directories were created.
@@ -85,6 +103,19 @@
public boolean mkdirs();
/**
+ * Set an entry to be executable by the user.
+ * <p>
+ * Not all platforms and JREs support executable flags on entries. If the
+ * feature is unsupported this method will always return false and no
+ * changes will be made to the entry specified.
+ *
+ * @param executable
+ * true to enable execution; false to disable it.
+ * @return true if the change succeeded; false otherwise.
+ */
+ public boolean setExecutable(boolean executable);
+
+ /**
* Retrieves the URI of this entry. URI in this case acts as a primary key
* to identify an entry.
* @return URI to identify this entry instance
@@ -101,7 +132,7 @@
/**
* Retrieves the InputStream for reading the content of the entry
* @return Input stream to read entry content
- * @throws IOException If no such file exists or there is any other error
+ * @throws IOException If no such entry exists or there is any other error
*/
public InputStream getInputStream()
throws IOException;
@@ -111,7 +142,7 @@ public InputStream getInputStream()
* opened to either overwrite it or append to it.
* @param overwrite False if to write in append mode else true
* @return Output stream to write content to
- * @throws IOException If no such file exists in append mode or there is any
+ * @throws IOException If no such entry exists in append mode or there is any
* error in retrieving it.
*/
public OutputStream getOutputStream(boolean overwrite)
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
index d3e60ab..46c663b 100644
--- a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
@@ -65,5 +65,20 @@
* @return Entry for current working directory.
*/
public Entry getWorkingDirectory();
-
+
+ /**
+ * Retrieve the home directory of the current user
+ * @return Home directory
+ */
+ public Entry getHomeDirectory();
+
+ /**
+ * Resolve relative path with respect to a path and return the absolute
+ * entry representing the relative path.
+ * @param entry The point of reference for the relative path
+ * @param path The relative path
+ * @return The absolute entry representing the relative path entry
+ */
+ public Entry resolve(Entry entry,
+ String path);
}
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
index 20a64cb..3d5fab4 100644
--- a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
@@ -43,6 +43,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import org.eclipse.jgit.io.Entry;
import org.eclipse.jgit.io.StorageSystem;
@@ -60,7 +61,7 @@
implements Entry {
private File localFile;
- private StorageSystem storageSystem;
+ private LocalFileSystem storageSystem;
/**
* Contructs an entry based of on the local file system storage and a file
@@ -70,7 +71,7 @@
* @throws IllegalArgumentException If either argument is NULL
*/
protected LocalFileEntry(File localFile,
- StorageSystem storageSystem)
+ LocalFileSystem storageSystem)
throws IllegalArgumentException {
setLocalFile(localFile);
setStorageSystem(storageSystem);
@@ -81,7 +82,7 @@ protected LocalFileEntry(File localFile,
* @param storageSystem Storage system
* @throws IllegalArgumentException IF storageSystem is null
*/
- protected void setStorageSystem(StorageSystem storageSystem)
+ protected void setStorageSystem(LocalFileSystem storageSystem)
throws IllegalArgumentException {
if (storageSystem == null) {
throw new IllegalArgumentException("Storage system can't be NULL!");
@@ -216,4 +217,49 @@ public StorageSystem getStorageSystem() {
public long length() {
return getLocalFile().length();
}
+
+ public boolean isExecutableSupported() {
+ return LocalFileSystem.platform.isExecutableSupproted();
+ }
+
+ public boolean isExecutable() {
+ if (LocalFileSystem.platform.isExecutableSupproted()) {
+ try {
+ final Object r = LocalFileSystem.canExecute.invoke(
+ getLocalFile(),
+ (Object[]) null);
+ return ((Boolean) r).booleanValue();
+ }
+ catch (IllegalArgumentException e) {
+ throw new Error(e);
+ }
+ catch (IllegalAccessException e) {
+ throw new Error(e);
+ }
+ catch (InvocationTargetException e) {
+ throw new Error(e);
+ }
+ }
+ else {
+ return false;
+ }
+ }
+
+ public boolean setExecutable(boolean executable) {
+ try {
+ final Object r;
+ r = LocalFileSystem.setExecute.invoke(getLocalFile(), new Object[] {
+ Boolean.valueOf(executable)});
+ return ((Boolean) r).booleanValue();
+ }
+ catch (IllegalArgumentException e) {
+ throw new Error(e);
+ }
+ catch (IllegalAccessException e) {
+ throw new Error(e);
+ }
+ catch (InvocationTargetException e) {
+ throw new Error(e);
+ }
+ }
}
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
index cf289ec..f18dbde 100644
--- a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
@@ -36,8 +36,14 @@
*/
package org.eclipse.jgit.io.localfs;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Method;
import java.net.URI;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import org.eclipse.jgit.io.Entry;
import org.eclipse.jgit.io.StorageSystem;
@@ -48,14 +54,23 @@
*/
public class LocalFileSystem
implements StorageSystem {
+
public static final String PROTOCOL_FILE = "file";
+ public static final Platform platform;
+ public static Method canExecute;
+ public static Method setExecute;
+ public static String cygpath;
+
+ static {
+ platform = Platform.detect();
+ }
public String getURIScheme() {
return PROTOCOL_FILE;
}
public Entry getEntry(URI uri) {
- if(uri == null) {
+ if (uri == null) {
return null;
}
else {
@@ -67,4 +82,149 @@ public Entry getWorkingDirectory() {
String curDir = System.getProperty("user.dir");
return new LocalFileEntry(new File(curDir), this);
}
+
+ public Entry resolve(Entry entry,
+ String path) {
+ if (!(entry instanceof LocalFileEntry)) {
+ return null;
+ }
+ LocalFileEntry fileEntry = (LocalFileEntry) entry;
+ File localFile = fileEntry.getLocalFile();
+ if (platform.equals(Platform.WIN32_CYGWIN)) {
+ try {
+ final Process p;
+
+ p = Runtime.getRuntime().exec(
+ new String[] {cygpath, "--windows", "--absolute", path},
+ null, localFile);
+ p.getOutputStream().close();
+
+ final BufferedReader lineRead = new BufferedReader(
+ new InputStreamReader(p.getInputStream(), "UTF-8"));
+ String r = null;
+ try {
+ r = lineRead.readLine();
+ }
+ finally {
+ lineRead.close();
+ }
+
+ for (;;) {
+ try {
+ if (p.waitFor() == 0 && r != null && r.length() > 0) {
+ return new LocalFileEntry(new File(r), this);
+ }
+ break;
+ }
+ catch (InterruptedException ie) {
+ // Stop bothering me, I have a zombie to reap.
+ }
+ }
+ }
+ catch (IOException ioe) {
+ // Fall through and use the default return.
+ }
+
+ }
+ final File abspn = new File(path);
+ if (abspn.isAbsolute()) {
+ return new LocalFileEntry(abspn, this);
+ }
+ return new LocalFileEntry(new File(localFile, path), this);
+ }
+
+ public Entry getHomeDirectory() {
+ if (platform.equals(Platform.WIN32_CYGWIN)) {
+ final String home = AccessController.doPrivileged(new PrivilegedAction<String>() {
+
+ public String run() {
+ return System.getenv("HOME");
+ }
+ });
+ if (!(home == null || home.length() == 0)) {
+ return resolve(new LocalFileEntry(new File("."), this), home);
+ }
+ }
+ final String home = AccessController.doPrivileged(new PrivilegedAction<String>() {
+
+ public String run() {
+ return System.getProperty("user.home");
+ }
+ });
+ if (home == null || home.length() == 0) {
+ return null;
+ }
+ return new LocalFileEntry(new File(home).getAbsoluteFile(), this);
+ }
+
+ public enum Platform {
+
+ WIN32_CYGWIN(false),
+ WIN32(false),
+ POSIX_JAVA5(false),
+ POSIX_JAVA6(true);
+ private boolean executableSupproted;
+
+ private Platform(boolean executableSupproted) {
+ this.executableSupproted = executableSupproted;
+ }
+
+ public boolean isExecutableSupproted() {
+ return executableSupproted;
+ }
+
+ public static Platform detect() {
+ final String osDotName = AccessController.doPrivileged(new PrivilegedAction<String>() {
+
+ public String run() {
+ return System.getProperty("os.name");
+ }
+ });
+ if (osDotName != null &&
+ osDotName.toLowerCase().indexOf("windows") != -1) {
+ final String path = AccessController.doPrivileged(new PrivilegedAction<String>() {
+
+ public String run() {
+ return System.getProperty("java.library.path");
+ }
+ });
+ if (path == null) {
+ return WIN32;
+ }
+ for (final String p : path.split(";")) {
+ final File e = new File(p, "cygpath.exe");
+ if (e.isFile()) {
+ cygpath = e.getAbsolutePath();
+ return WIN32_CYGWIN;
+ }
+ }
+ return WIN32;
+ }
+ else {
+ canExecute = needMethod(File.class, "canExecute");
+ setExecute = needMethod(File.class, "setExecutable",
+ Boolean.TYPE);
+ if (canExecute != null && setExecute != null) {
+ return POSIX_JAVA6;
+ }
+ else {
+ return POSIX_JAVA5;
+ }
+ }
+ }
+
+ private static Method needMethod(final Class<?> on,
+ final String name,
+ final Class<?>... args) {
+ try {
+ return on.getMethod(name, args);
+ }
+ catch (SecurityException e) {
+ return null;
+ }
+ catch (NoSuchMethodException e) {
+ return null;
+ }
+ }
+ }
}
--
1.6.2.1
^ permalink raw reply related
* [JGit-RFC-PATCH 2/3] Add JGit IO SPI and default implementation
From: imyousuf @ 2009-10-10 15:57 UTC (permalink / raw)
To: git; +Cc: spearce, egit-dev, Imran M Yousuf
In-Reply-To: <1255190221-19428-1-git-send-email-imyousuf@gmail.com>
From: Imran M Yousuf <imyousuf@smartitengineering.com>
The SPI mainly focus's in providing an API to JGit to be able to perform
similar operations to that of java.io.File. All direct I/O is based on the
java.io.Input/OutputStream classes.
Different JGit IO SPI provider is designed to be URI scheme based and thus
the default implementation is that of "file" scheme. SPI provider will be
integrated by their respective users in a manner similar to that of JDBC
driver registration. There is a SystemStorageManager that has similar
registration capabilities and the system storage providers should be
registered with the manager in one of the provided ways.
This SPI is based on the initial requirements for switching to it and thus
this SPI will change as required during full migration to it.
Signed-off-by: Imran M Yousuf <imyousuf@smartitengineering.com>
---
.../src/org/eclipse/jgit/io/Entry.java | 148 +++++++++++++
.../src/org/eclipse/jgit/io/StorageSystem.java | 58 +++---
.../org/eclipse/jgit/io/StorageSystemManager.java | 154 ++++++++++++++
.../eclipse/jgit/io/localfs/LocalFileEntry.java | 219 ++++++++++++++++++++
.../eclipse/jgit/io/localfs/LocalFileSystem.java | 53 +++---
5 files changed, 578 insertions(+), 54 deletions(-)
create mode 100644 org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
copy org.eclipse.jgit.test/tst/org/eclipse/jgit/util/JGitTestUtil.java => org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java (61%)
create mode 100644 org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystemManager.java
create mode 100644 org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
copy org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java => org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java (64%)
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
new file mode 100644
index 0000000..b8c3236
--- /dev/null
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/Entry.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2009, Imran M Yousuf <imyousuf@smartitengineering.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+
+/**
+ * Represents each entry in a storage system. For example, in a local filesystem
+ * storage it would represent {@link java.io.File}. Here the storage system
+ * mainly refers to where repository meta data such as git objects, ref logs,
+ * packs are stored; for example a '.git' directory and all its contents in a
+ * clone repo would correspond to an entry.
+ * @author Imran M Yousuf (imyousuf at smartitengineering.com)
+ * @since 0.6
+ */
+public interface Entry {
+
+ /**
+ * Retrieves the name of the entry
+ * @return Name of the entry
+ */
+ public String getName();
+
+ /**
+ * Retrieves the absolute path of the entry.
+ * @return Absoluth path
+ */
+ public String getAbsolutePath();
+
+ /**
+ * Retrieves whether the entry represents a directory or not
+ * @return True if represents a directory else false
+ */
+ public boolean isDirectory();
+
+ /**
+ * Signifies whether the entry is a new one or being read from the
+ * persistent storage
+ * @return True if being read form storage else false
+ */
+ public boolean isExists();
+
+ /**
+ * Make directories upto the entry represented by this instance, provided
+ * that this instance itself is a directory.
+ * @return True if directories were created.
+ */
+ public boolean mkdirs();
+
+ /**
+ * Retrieves the URI of this entry. URI in this case acts as a primary key
+ * to identify an entry.
+ * @return URI to identify this entry instance
+ */
+ public URI getURI();
+
+ /**
+ * Retrieves the length of the entry if its predictable.
+ * @return < 0 if the length is unpredictable else the length of the entry's
+ * content
+ */
+ public long length();
+
+ /**
+ * Retrieves the InputStream for reading the content of the entry
+ * @return Input stream to read entry content
+ * @throws IOException If no such file exists or there is any other error
+ */
+ public InputStream getInputStream()
+ throws IOException;
+
+ /**
+ * Retrieves the OutputStream for writing content into the entry. It can be
+ * opened to either overwrite it or append to it.
+ * @param overwrite False if to write in append mode else true
+ * @return Output stream to write content to
+ * @throws IOException If no such file exists in append mode or there is any
+ * error in retrieving it.
+ */
+ public OutputStream getOutputStream(boolean overwrite)
+ throws IOException;
+
+ /**
+ * Retrieve all the child entries of this entries if its a directory.
+ * @return If not a directory then a empty array else array of sub-entries.
+ */
+ public Entry[] getChildren();
+
+ /**
+ * Retrieve a specific child of an entry. It will basically match
+ * {@link Entry#getName() name} of the children to find and that too only
+ * the direct children.
+ * @param name Name of the child to find
+ * @return If child is not found then NULL or else the child specified by
+ * the name
+ */
+ public Entry getChild(String name);
+
+ /**
+ * Retrieve the parent entry of the current entry.
+ * @return NULL if no parent or else the direct parent of the current entry
+ */
+ public Entry getParent();
+
+ /**
+ * Retrieve the storage system this entry either is from or will be
+ * persisted to.
+ * @return Storage system of the entry, will never be NULL.
+ */
+ public StorageSystem getStorageSystem();
+}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/JGitTestUtil.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
similarity index 61%
copy from org.eclipse.jgit.test/tst/org/eclipse/jgit/util/JGitTestUtil.java
copy to org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
index b259185..d3e60ab 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/JGitTestUtil.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, Imran M Yousuf <imyousuf@smartitengineering.com>
+ * Copyright (C) 2009, Imran M Yousuf <imyousuf@smartitengineering.com>
*
* All rights reserved.
*
@@ -34,38 +34,36 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+package org.eclipse.jgit.io;
-package org.eclipse.jgit.util;
+import java.net.URI;
-import java.io.File;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-public abstract class JGitTestUtil {
- public static final String CLASSPATH_TO_RESOURCES = "org/eclipse/jgit/test/resources/";
+/**
+ * SPI providing access to the underlying storage system. Each provider is
+ * differentiated using their {@link StorageSystem#getURIProtocol() URI Protocol}.
+ * @author Imran M Yousuf (imyousuf at smartitengineering.com)
+ * @since 0.6
+ */
+public interface StorageSystem {
- private JGitTestUtil() {
- throw new UnsupportedOperationException();
- }
+ /**
+ * Returns the supported scheme of this storage system.
+ * @return Scheme supported by this storage system.
+ * @see {@link http://tr.im/BiQ0 URI Scheme}
+ */
+ public String getURIScheme();
- public static File getTestResourceFile(final String fileName) {
- if (fileName == null || fileName.length() <= 0) {
- return null;
- }
- final URL url = cl().getResource(CLASSPATH_TO_RESOURCES + fileName);
- if (url == null) {
- // If URL is null then try to load it as it was being
- // loaded previously
- return new File("tst", fileName);
- }
- try {
- return new File(url.toURI());
- } catch(URISyntaxException e) {
- return new File(url.getPath());
- }
- }
+ /**
+ * Retrieve an entry using its URI
+ * @param uri URI to retrieve the entry for.
+ * @return Entry representing the URI
+ */
+ public Entry getEntry(URI uri);
- private static ClassLoader cl() {
- return JGitTestUtil.class.getClassLoader();
- }
+ /**
+ * Retrieve the current working directory from the file system if any.
+ * @return Entry for current working directory.
+ */
+ public Entry getWorkingDirectory();
+
}
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystemManager.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystemManager.java
new file mode 100644
index 0000000..ae28865
--- /dev/null
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/StorageSystemManager.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2009, Imran M Yousuf <imyousuf@smartitengineering.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.io;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Hashtable;
+import java.util.Map;
+import org.eclipse.jgit.io.localfs.LocalFileSystem;
+
+/**
+ * Manager that registers different storage system for different {@link URI}
+ * schemes and serves users with {@link Entry} or {@link StorageSystem} as URI
+ * schemes request.
+ * @author Imran M Yousuf (imyousuf at smartitengineering.com)
+ * @since 0.6
+ */
+public class StorageSystemManager {
+
+ /**
+ * Map to act as registrar for all registered schemes
+ */
+ private static Map<String, StorageSystem> storageSystemMap;
+
+ /**
+ * Initialize the registrar and and load the instance for default storage,
+ * i.e. the local file system.
+ */
+ static {
+ storageSystemMap = new Hashtable<String, StorageSystem>();
+ try {
+ register(LocalFileSystem.class);
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Retrieves the storage system for a given scheme from the registrar.
+ * @param scheme Scheme to retrieve; it should never be null
+ * @return Storage system representing the scheme.
+ * @throws IOException If scheme is null or scheme does not exist.
+ */
+ public static StorageSystem getStorageSystem(String scheme)
+ throws IOException {
+ if (scheme != null && storageSystemMap.containsKey(scheme)) {
+ return storageSystemMap.get(scheme);
+ }
+ else {
+ throw new IOException("Scheme ( " + scheme +
+ " ) not registered with manager!");
+ }
+ }
+
+ /**
+ * Load an storage system entry using its respective URI.
+ * @param uri URI to retrieve the storage system entity for
+ * @return The entry in the storage system for the requested URI
+ * @throws IOException If scheme does not exist.
+ * @throws NullPointerException If uri is null
+ */
+ public static Entry getEntry(URI uri)
+ throws IOException,
+ NullPointerException {
+ String scheme = uri.getScheme();
+ return getStorageSystem(scheme).getEntry(uri);
+ }
+
+ /**
+ * Registers a {@link StorageSystem} implementaiton against its schema into
+ * the registrar using the implementions fully qualified class name and its
+ * non-args constructor.
+ * @param storageSystemClassName The class names representation is string.
+ * @throws ClassNotFoundException If no class is found with the name specified
+ * @throws InstantiationException If there is any exception during
+ * initialization
+ * @throws IllegalAccessException If the class dpes not have a public
+ * non-args constructor
+ * @throws ClassCastException If the class does implement {@link StorageSystem}
+ */
+ public static void register(String storageSystemClassName)
+ throws ClassNotFoundException,
+ InstantiationException,
+ IllegalAccessException,
+ ClassCastException {
+ register((Class<? extends StorageSystem>) Class.forName(
+ storageSystemClassName));
+ }
+
+ /**
+ * Registers a {@link StorageSystem} implementaiton against its schema into
+ * the registrar using the implemention class name and its non-args constructor.
+ * @param storageSystemClassName The class names representation is string.
+ * @throws InstantiationException If there is any exception during
+ * initialization
+ * @throws IllegalAccessException If the class dpes not have a public
+ * non-args constructor
+ */
+ public static void register(
+ Class<? extends StorageSystem> storageSystemClass)
+ throws InstantiationException,
+ IllegalAccessException {
+ if (storageSystemClass != null) {
+ StorageSystem system = storageSystemClass.newInstance();
+ register(system);
+ }
+ }
+
+ /**
+ * Registers a {@link StorageSystem} instance into the reigstrar. It would be
+ * particularly useful if system does not have a non-args constructor.
+ * @param system System to register in the manager
+ */
+ public static void register(StorageSystem system) {
+ if (system != null) {
+ storageSystemMap.put(system.getURIScheme(), system);
+ }
+ }
+}
diff --git a/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
new file mode 100644
index 0000000..20a64cb
--- /dev/null
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileEntry.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2009, Imran M Yousuf <imyousuf@smartitengineering.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.io.localfs;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import org.eclipse.jgit.io.Entry;
+import org.eclipse.jgit.io.StorageSystem;
+import org.eclipse.jgit.io.StorageSystemManager;
+
+/**
+ * Entry implementation for local file system. This class should not be
+ * initialized directly unless its a {@link LocalFileSystem}. SPI users should
+ * use {@link StorageSystemManager#getEntry(java.net.URI)} to get the first
+ * {@link Entry} and then traverse from there onwards.
+ * @author Imran M Yousuf (imyousuf at smartitengineering.com)
+ * @since 0.6
+ */
+public class LocalFileEntry
+ implements Entry {
+
+ private File localFile;
+ private StorageSystem storageSystem;
+
+ /**
+ * Contructs an entry based of on the local file system storage and a file
+ * that will be represented by this entry.
+ * @param localFile File represented by this entry
+ * @param storageSystem Storage system of the entry
+ * @throws IllegalArgumentException If either argument is NULL
+ */
+ protected LocalFileEntry(File localFile,
+ StorageSystem storageSystem)
+ throws IllegalArgumentException {
+ setLocalFile(localFile);
+ setStorageSystem(storageSystem);
+ }
+
+ /**
+ * Sets the storage system instance for this entry.
+ * @param storageSystem Storage system
+ * @throws IllegalArgumentException IF storageSystem is null
+ */
+ protected void setStorageSystem(StorageSystem storageSystem)
+ throws IllegalArgumentException {
+ if (storageSystem == null) {
+ throw new IllegalArgumentException("Storage system can't be NULL!");
+ }
+ this.storageSystem = storageSystem;
+ }
+
+ /**
+ * Retrieves the file being adapted by this entry.
+ * @return File being adapted
+ */
+ public File getLocalFile() {
+ return localFile;
+ }
+
+ /**
+ * Sets the file which is to be used as adapt from this instance by this
+ * implementation
+ * @param localFile Local file being adapted by this instance
+ * @throws IllegalArgumentException If localFile is null
+ */
+ protected void setLocalFile(File localFile)
+ throws IllegalArgumentException {
+ if (localFile == null) {
+ throw new IllegalArgumentException(
+ "Local file to be set can't be NULL");
+ }
+ this.localFile = localFile;
+ }
+
+ public String getName() {
+ return getLocalFile().getName();
+ }
+
+ public String getAbsolutePath() {
+ return getLocalFile().getAbsolutePath();
+ }
+
+ public boolean isDirectory() {
+ return getLocalFile().isDirectory();
+ }
+
+ public boolean isExists() {
+ return getLocalFile().exists();
+ }
+
+ public boolean mkdirs() {
+ return getLocalFile().mkdirs();
+ }
+
+ public URI getURI() {
+ return getLocalFile().toURI();
+ }
+
+ public InputStream getInputStream()
+ throws IOException {
+ if (getLocalFile().exists()) {
+ try {
+ return new FileInputStream(getLocalFile());
+ }
+ catch (FileNotFoundException ex) {
+ throw ex;
+ }
+ }
+ else {
+ throw new FileNotFoundException("File does not exists!");
+ }
+ }
+
+ public OutputStream getOutputStream(boolean overwrite)
+ throws IOException {
+ try {
+ if (!isExists()) {
+
+ return new FileOutputStream(getLocalFile());
+ }
+ else {
+ if (overwrite) {
+ return new FileOutputStream(getLocalFile());
+ }
+ else {
+ return new FileOutputStream(getLocalFile(), true);
+ }
+ }
+ }
+ catch (FileNotFoundException ex) {
+ throw ex;
+ }
+ }
+
+ public Entry[] getChildren() {
+ File[] children = getLocalFile().listFiles();
+ if (children == null || children.length == 0) {
+ return new Entry[0];
+ }
+ else {
+ Entry[] entries = new Entry[children.length];
+ for (int i = 0; i < children.length; ++i) {
+ entries[i] = getStorageSystem().getEntry(children[i].toURI());
+ }
+ return entries;
+ }
+ }
+
+ public Entry getChild(String name) {
+ if (name == null || name.length() == 0) {
+ return null;
+ }
+ Entry[] children = getChildren();
+ for (Entry entry : children) {
+ if (name.equals(entry.getName())) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ public Entry getParent() {
+ File parent = getLocalFile().getParentFile();
+ if (parent == null) {
+ return null;
+ }
+ else {
+ return getStorageSystem().getEntry(parent.toURI());
+ }
+ }
+
+ public StorageSystem getStorageSystem() {
+ return storageSystem;
+ }
+
+ public long length() {
+ return getLocalFile().length();
+ }
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
similarity index 64%
copy from org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java
copy to org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
index bb4ac3b..cf289ec 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/errors/RepositoryNotFoundException.java
+++ b/org.eclipse.jgit.io/src/org/eclipse/jgit/io/localfs/LocalFileSystem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009, Google Inc.
+ * Copyright (C) 2009, Imran M Yousuf <imyousuf@smartitengineering.com>
*
* All rights reserved.
*
@@ -34,32 +34,37 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
-package org.eclipse.jgit.errors;
+package org.eclipse.jgit.io.localfs;
import java.io.File;
+import java.net.URI;
+import org.eclipse.jgit.io.Entry;
+import org.eclipse.jgit.io.StorageSystem;
+
+/**
+ * Implementation of storage system for the local file system.
+ * @author Imran M Yousuf (imyousuf at smartitengineering.com)
+ * @since 0.6
+ */
+public class LocalFileSystem
+ implements StorageSystem {
+ public static final String PROTOCOL_FILE = "file";
-/** Indicates a local repository does not exist. */
-public class RepositoryNotFoundException extends TransportException {
- private static final long serialVersionUID = 1L;
+ public String getURIScheme() {
+ return PROTOCOL_FILE;
+ }
- /**
- * Constructs an exception indicating a local repository does not exist.
- *
- * @param location
- * description of the repository not found, usually file path.
- */
- public RepositoryNotFoundException(final File location) {
- this(location.getPath());
- }
+ public Entry getEntry(URI uri) {
+ if(uri == null) {
+ return null;
+ }
+ else {
+ return new LocalFileEntry(new File(uri), this);
+ }
+ }
- /**
- * Constructs an exception indicating a local repository does not exist.
- *
- * @param location
- * description of the repository not found, usually file path.
- */
- public RepositoryNotFoundException(final String location) {
- super("repository not found: " + location);
- }
+ public Entry getWorkingDirectory() {
+ String curDir = System.getProperty("user.dir");
+ return new LocalFileEntry(new File(curDir), this);
+ }
}
--
1.6.2.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox