summaryrefslogtreecommitdiff
path: root/git-cvsserver.perl
Commit message (Collapse)AuthorAgeFilesLines
* git-cvsserver: add ability to guess -kb from contentsMatthew Ogilvie2008-05-161-16/+177
| | | | | | | | | | If "gitcvs.allbinary" is set to "guess", then any file that has not been explicitly marked as binary or text using the "crlf" attribute and the "gitcvs.usecrlfattr" config will guess binary based on the contents of the file. Signed-off-by: Matthew Ogilvie <mmogilvi_git@miniinfo.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* implement gitcvs.usecrlfattrMatthew Ogilvie2008-05-161-11/+60
| | | | | | | | | If gitcvs.usecrlfattr is set to true, git-cvsserver will consult the "crlf" for each file to determine if it should mark the file as binary (-kb). Signed-off-by: Matthew Ogilvie <mmogilvi_git@miniinfo.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* git-cvsserver: add mechanism for managing working tree and current directoryMatthew Ogilvie2008-05-161-39/+213
| | | | | | | | | | | | | | | | | There are various reasons git-cvsserver needs to manipulate the current directory, and this patch attempts to clarify and validate such changes: 1. Temporary empty working directory (with index) for certain operations that require an index file to work. 2. Use a temporary directory with temporary file names for doing merges of user's dirty sandbox state with latest changes in repository. 3. Coming up soon: Set up an index and either a valid or empty working directory when calling git-check-attr to decide if a file should be marked binary (-kb). Signed-off-by: Matthew Ogilvie <mmogilvi_git@miniinfo.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* Merge branch 'pb/cvsserver'Junio C Hamano2008-04-021-1/+1
|\ | | | | | | | | * pb/cvsserver: git-cvsserver: handle change type T
| * git-cvsserver: handle change type TPaolo Bonzini2008-03-271-1/+1
| | | | | | | | | | | | | | | | git-cvsserver does not support changes of type T (file type change, e.g. symlink->real file). This patch treats them the same as changes of type M. Signed-off-by: Junio C Hamano <gitster@pobox.com>
* | Merge branch 'dd/cvsserver'Junio C Hamano2008-04-021-19/+59
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * dd/cvsserver: cvsserver: Use the user part of the email in log and annotate results cvsserver: Add test for update -p cvsserver: Implement update -p (print to stdout) cvsserver: Add a few tests for 'status' command cvsserver: Do not include status output for subdirectories if -l is passed cvsserver: Only print the file part of the filename in status header cvsserver: Respond to the 'editors' and 'watchers' commands
| * | cvsserver: Use the user part of the email in log and annotate resultsDamien Diederen2008-03-271-4/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Generate the CVS author names by taking the first eight characters of the user part of the email address. The resulting names are more likely to make sense (or at least reduce ambiguities) in "corporate" environments. Signed-off-by: Damien Diederen <dash@foobox.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
| * | cvsserver: Implement update -p (print to stdout)Damien Diederen2008-03-271-12/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Cvs update -p -r <rev> <path> is the documented way to retrieve a specific revision of a file (similar to git show <rev>:<path>). Without this patch, the -p flag is ignored and status output is produced, causing clients to interpret it as the contents of the file. TkCVS uses update -p as a basis for implementing its various "View" and "Diff" commands. Signed-off-by: Damien Diederen <dash@foobox.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
| * | cvsserver: Do not include status output for subdirectories if -l is passedDamien Diederen2008-03-271-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This effectively implements the -l switch by pruning the entries whose filenames contain a path separator. It was previously ignored. Without this, TkCVS includes strange "ghost" entries in its directory listings. Signed-off-by: Damien Diederen <dash@foobox.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
| * | cvsserver: Only print the file part of the filename in status headerDamien Diederen2008-03-271-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | The "File:" header of CVS status output only includes the basename of the file, even when generating a recursive listing; do the same. Signed-off-by: Damien Diederen <dash@foobox.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
| * | cvsserver: Respond to the 'editors' and 'watchers' commandsDamien Diederen2008-03-271-2/+7
| |/ | | | | | | | | | | | | | | | | | | | | These commands list users editing and watching locked files. This trivial implementation always returns an empty response, since git-cvsserver does not implement file locking. Without this, TkCVS hangs at startup, waiting forever for a response. Signed-off-by: Damien Diederen <dash@foobox.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* | Allow git-cvsserver database table name prefix to be specified.Josh Elsasser2008-03-301-30/+93
|/ | | | | | | | | | | Adds a gitcvs.dbtablenameprefix config variable, the contents of which are prepended to any database tables names used by git-cvsserver. The same substutions as gitcvs.dbname and gitcvs.dbuser are supported, and any non-alphabetic characters are replaced with underscores. A typo found in contrib/completion/git-completion.bash is also fixed. Signed-off-by: Junio C Hamano <gitster@pobox.com>
* specify explicit "--pretty=medium" with `git log/show/whatchanged`Denis Cheng2008-03-051-1/+1
| | | | | | | | | | | The following patch will introduce a new configuration variable, "format.pretty", from then on the pretty format without specifying "--pretty" might not be the default "--pretty=medium", it depends on the user's config. So all kinds of Shell/Perl/Emacs scripts that needs the default medium pretty format must specify it explicitly. Signed-off-by: Denis Cheng <crquan@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Fix for histories with multiple rootsSteffen Prohaska2008-01-261-1/+8
| | | | | | | | | | | | | | | | Git histories may have multiple roots, which can cause git merge-base to fail and this caused git cvsserver to die. This commit teaches git cvsserver to handle a failing git merge-base gracefully, and modifies the test case to verify this. All the test cases now use a history with two roots. Signed-off-by: Steffen Prohaska <prohaska@zib.de> git-cvsserver.perl | 9 ++++++++- t/t9400-git-cvsserver-server.sh | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) Signed-off-by: Junio C Hamano <gitster@pobox.com>
* git-cvsserver runs hooks/post-updateJunio C Hamano2007-12-051-0/+6
| | | | | | | Although we have introduced post-receive, we have not deprecated post-update hook. This adds support for it to emulate receive-pack better. Signed-off-by: Junio C Hamano <gitster@pobox.com>
* git-cvsserver runs hooks/post-receiveMichael Witten2007-12-051-7/+20
| | | | | | | | | | | | | | | git-cvsserver just did the following: (1) run hooks/update (2) commit if hooks/update passed This commit simply adds: (3) run hooks/post-receive Also, there are a few grammar cleanups and consistency improvements. Signed-off-by: Michael Witten <mfwitten@mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Use exit 1 instead of die when req_Root fails.Brian Gernhardt2007-10-181-2/+4
| | | | | | | This was causing test failures because die was exiting 255. Signed-off-by: Brian Gernhardt <benji@silverinsanity.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* cvsserver: Fix for work treesBrian Downing2007-08-081-0/+2
| | | | | | | | | | git-cvsserver used checkout-index internally for commit and annotate. Since a work tree is required for this to function now, this was breaking. Work around this by defining GIT_WORK_TREE=. in the appropriate places. Signed-off-by: Brian Downing <bdowning@lavos.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* git-cvsserver: detect/diagnose write failure, etc.Jim Meyering2007-07-141-17/+33
| | | | | | | | | There were many operations that did not notice and report errors to the CVS client, which would have resulted in corrupt working tree. Signed-off-by: Jim Meyering <jim@meyering.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: always initialize state in argsplit()Frank Lichtenheld2007-07-061-4/+4
| | | | | | | | | Other code assumes that this is initialized, so do it even if there were no arguments given. Signed-off-by: Dirk Koopman <djk@tobit.co.uk> Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Actually implement --export-allFrank Lichtenheld2007-06-151-1/+7
| | | | | | | | | | | Embarrassing bug number two in my options patch. Also enforce that --export-all is only ever used together with an explicit whitelist. Otherwise people might export every git repository on the whole system without realising. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Let --base-path and pserver get along just fineFrank Lichtenheld2007-06-151-4/+6
| | | | | | | | | | | | Embarassing bug number one in my options patch. Since the code for --base-path support rewrote the cvsroot value after comparing it with a possible existing value (i.e. from pserver authentication) the check always failed. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Add some useful commandline optionsFrank Lichtenheld2007-06-081-6/+73
| | | | | | | | | | | | | | | | | | | | | | | | | | | Make git-cvsserver understand some options inspired by git-daemon, namely --base-path, --export-all, --strict-paths. Also allow the caller to specify a whitelist of allowed directories, again similar to git-daemon. While already adding option parsing also support the common --help and --version options. Rationale: While the gitcvs.enabled configuration option already offers means to limit git-cvsserver access to a repository, there are some use cases where other methods of access control prove to be more useful. E.g. if setting up a pserver for a collection of public repositories one might want limit the exported repositories to exactly the directory this collection is located whithout having to worry about other repositories that might lie around with the configuration variable set (never trust your users ;) Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Make req_Root more critical of its input dataFrank Lichtenheld2007-06-081-0/+11
| | | | | | | | | | | | | | | | | The path submitted with the Root request has to be absolute (cvs does it this way and it may save us some sanity checks later) If multiple roots are specified (e.g. because we use pserver authentication which will already include the root), ensure that they say all the same. Probably neither is a security risk, and neither should ever be triggered by a sane client, but when validating input data, it's better to be save than sorry. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
* cvsserver: Handle 'cvs login'Frank Lichtenheld2007-05-291-3/+5
| | | | | | | | | Since this is a trivial variation of the general pserver authentication, there is really no reason not to support it. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* git-cvsserver: fix disabling service via per-method configJunio C Hamano2007-05-211-5/+3
| | | | | | | | | | When the per-method enable logic disables the access, we should not even look at the global one. git-cvsserver.perl | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) Signed-off-by: Junio C Hamano <junkio@cox.net>
* git-cvsserver: exit with 1 upon "I HATE YOU"Junio C Hamano2007-05-201-1/+1
| | | | Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Don't send mixed messages to clientsFrank Lichtenheld2007-05-131-0/+1
| | | | | | | | | | | | | | | | | After we send I HATE YOU we should probably exit and not happily continue with I LOVE YOU and further communication. Most clients will probably just exit and ignore everything we send after the I HATE YOU and it is not a security problem either because we don't really care about the user name anyway. But it is still the right thing to do. [jc: with a minor fixup to its exit code...] Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Acked-by: "Martin Langhoff" <martin.langhoff@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Limit config parser to needed optionsFrank Lichtenheld2007-05-131-3/+3
| | | | | | | | | | | | | | | | | | | Change the configuration parser so that it ignores everything except for ^gitcvs.((ext|pserver).)? This greatly reduces the risk of failing while parsing some unknown and irrelevant config option. The bug that triggered this change was that the parsing doesn't handle sections that have a subsection and a variable with the same name. While this bug still remains, all remaining causes can be attributed to user error, since there are no defined variables gitcvs.ext and gitcvs.pserver. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* Merge branch 'maint'Junio C Hamano2007-05-021-1/+1
|\ | | | | | | | | | | * maint: cvsserver: Handle re-added files correctly Fix compilation of test-delta
| * cvsserver: Handle re-added files correctlyFrank Lichtenheld2007-05-021-1/+1
| | | | | | | | | | | | | | | | | | | | We can't unconditionally assign revision 1.1 to newly added files. In case the file did exist in the past and was deleted we need to honor the old revision number. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* | Merge branch 'fl/cvsserver'Junio C Hamano2007-04-171-15/+94
|\ \ | |/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * fl/cvsserver: config.txt: Add gitcvs.db* variables cvsserver: Document the GIT branches -> CVS modules mapping more prominently cvsserver: Reword documentation on necessity of write access cvsserver: Allow to "add" a removed file cvsserver: Add asciidoc documentation for new database backend configuration cvsserver: Corrections to the database backend configuration cvsserver: Use DBI->table_info instead of DBI->tables cvsserver: Abort if connect to database fails cvsserver: Make the database backend configurable cvsserver: Allow to override the configuration per access method cvsserver: Handle three part keys in git config correctly cvsserver: Introduce new state variable 'method' Conflicts: Documentation/config.txt
| * cvsserver: Allow to "add" a removed fileFrank Lichtenheld2007-04-121-0/+40
| | | | | | | | | | | | | | | | | | | | | | | | CVS allows you to add a removed file (where the removal is not yet committed) which will cause the server to send the latest revision of the file and to delete the "removed" status. Copy this behaviour. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Corrections to the database backend configurationFrank Lichtenheld2007-04-071-2/+4
| | | | | | | | | | | | | | | | | | | | | | Don't include the scheme name in gitcvs.dbdriver, it is always 'dbi' anyway. Don't allow ':' in driver names nor ';' in database names for sanity reasons. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Use DBI->table_info instead of DBI->tablesFrank Lichtenheld2007-03-311-3/+1
| | | | | | | | | | | | | | | | | | | | DBI->table_info is portable across different DBD backends, DBI->tables is not. Limit the output to objects of type TABLE. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de>
| * cvsserver: Abort if connect to database failsFrank Lichtenheld2007-03-221-0/+1
| | | | | | | | | | | | | | | | | | | | | | Currently all calls to the database backend make no error checking or handling at all. At least abort if the connection to the database failed since there is really no way we could do anything useful after that. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Make the database backend configurableFrank Lichtenheld2007-03-221-6/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make all the different parts of the database backend connection configurable. This adds the following string configuration variables: - gitcvs.dbdriver - gitcvs.dbname - gitcvs.dbuser - gitcvs.dbpass The default values emulate the current behavior exactly for backwards compatibility. All configuration variables can also be specified for a specific access method (i.e. in the form gitcvs.<method>.<var>) The dbdriver/dbuser/dbpass variables are added for completness. No other backend than SQLite is tested yet. The dbname variable on the other hand is useful with this backend already (to not discriminate against other possible backends it was not splitted in dbdir and dbfile). Both dbname and dbuser support dynamic variable substitution where the available variables are: %m -- the CVS 'module' (i.e. GIT 'head') worked on %a -- CVS access method used (i.e. 'ext' or 'pserver') %u -- User name of the user invoking git-cvsserver %G -- .git directory name %g -- .git directory name, mangled to be used in a filename, currently this substitutes all chars except for [\w.-] with '_' Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Allow to override the configuration per access methodFrank Lichtenheld2007-03-221-3/+7
| | | | | | | | | | | | | | | | | | Allow to override the gitcvs.enabled and gitcvs.logfile configuration variables for each access method (i.e. "ext" or "pserver") in the form gitcvs.<method>.<var> Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Handle three part keys in git config correctlyFrank Lichtenheld2007-03-221-2/+6
| | | | | | | | | | | | | | | | This is intended to be used in the form gitcvs.<method>.<var> but this patch doesn't introduce any users yet. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
| * cvsserver: Introduce new state variable 'method'Frank Lichtenheld2007-03-221-1/+3
| | | | | | | | | | | | | | | | $state->{method} contains the CVS access method used, either 'ext' or 'pserver' Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* | cvsserver: Fix handling of diappeared files on updateFrank Lichtenheld2007-04-111-0/+1
|/ | | | | | | | | | | | | | Only send a modified response if the client sent a "Modified" entry. This fixes the case where the file was locally deleted on the client without being removed from CVS. In this case the client will only have sent the Entry for the file but nothing else. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Acked-by: Martin Langhoff <martin@catalyst.net.nz> Acked-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: further improve messages on commit and statusFrank Lichtenheld2007-03-141-3/+6
| | | | | | | | | | | | commit: Also print the old revision similar to how cvs does it and prepend a line stating the filename so that one can actually understand what happened when commiting more than one file. status: Fix the RCS filename displayed. The directory was printed twice. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Be more chattyFrank Lichtenheld2007-03-141-0/+8
| | | | | | | | Submit some additional messages to the client on commit and update. Inspired by the standard CVS server though a little more terse. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Use Merged response instead of Update-existing for merged filesFrank Lichtenheld2007-03-111-3/+3
| | | | | | | | | | Using Update-existing leads to the client forgetting about the "locally modified" status of the file which can lead to loss of local changes on later updates. Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de> Acked-by: Martin Langhoff <martin.langhoff@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Make always-binary mode a config file optionAndy Parkins2007-02-271-9/+38
| | | | | | | | | | | | | | | | | | The config option gitcvs.allbinary may be set to force all entries to get the -kb flag. In the future the gitattributes system will probably be a more appropriate way of doing this, but that will easily slot in as the entries lines sent to the CVS client now have their kopts set via the function kopts_from_path(). In the interim it might be better to not just have a all-or-nothing approach, but rather detect based on file extension (or file contents?). That would slot in easily here as well. However, I personally prefer everything to be binary-safe, so I just switch the switch. Signed-off-by: Andy Parkins <andyparkins@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
* cvsserver: Remove trailing "\n" from commithash in checkin functionAndy Parkins2007-02-271-0/+1
| | | | | | | | | | | | | | | The commithash for updating the ref is obtained from a call to git-commit-tree. However, it was returned (and stored) with the trailing newline. This meant that the later call to git-update-ref that was trying to update to $commithash was including the newline in the parameter - obviously that hash would never exist, and so git-update-ref would always fail. The solution is to chomp() the commithash as soon as it is returned by git-commit-tree. Signed-off-by: Andy Parkins <andyparkins@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
* Make 'cvs ci' lockless in git-cvsserver by using git-update-refJunio C Hamano2007-02-271-27/+16
| | | | | | | | | | | | | | This makes "ci" codepath lockless by following the usual "remember the tip, do your thing, then compare and swap at the end" update pattern using update-ref. Incidentally, by updating the code that reads where the tip of the head is to use show-ref, it makes it safe to use in a repository whose refs are pack-pruned. I noticed that other parts of the program are not yet pack-refs safe, but tried to keep the changes to the minimum. Signed-off-by: Junio C Hamano <junkio@cox.net>
* Have git-cvsserver call hooks/update before really altering the refAndy Parkins2007-02-141-0/+15
| | | | | | | | | | | | | | | | git-cvsserver is analogous to git-receive-pack; a checking from a cvs client to a central server is like a git-push from a working repository. Therefore it's nice to use the same access control (and email sending) that a receive-pack would perform. This patch tests for an executable update hook; if it is it is run with the ref being updated and the old and new hashes as normal. If the update hook returns an error code the update is aborted and the ref is never updated. The cvsserver returns "error 1" to the client to signal there was an EPERM error. Signed-off-by: Andy Parkins <andyparkins@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
* [PATCH] Rename git-repo-config to git-config.Tom Prince2007-01-281-3/+3
| | | | | Signed-off-by: Tom Prince <tom.prince@ualberta.net> Signed-off-by: Junio C Hamano <junkio@cox.net>
* New files in git weren't being downloaded during CVS updateAndy Parkins2007-01-241-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a repository was checked out via git-cvsserver and then later a new file is added to the git repository via some other method; a CVS update wasn't fetching the new file. It would be reported as a new file as A some/dir/newfile.c but would never appear in the directory. The problem seems to be that git-cvsserver was treating these two cases identically, as "A" type results. 1. New file in repository 2. New file locally In fact, traditionally, case 1 is treated as a "U" result, and case 2 only is treated as an "A" result. "A", should just report that the file is added locally and then skip that file during an update as there is (of course) nothing to send. In both these cases there is no working revision, so the checking for "is there no working revision" will return true. The test for case 2 needs refining to say "if there is no working revision and no upstream revision". This patch does just that, leaving case 1 to be handled by the normal "U" handler. I've also updated the log message to more accurately describe the operation. i.e. that "A" means that content is scheduled for addition; not that it actually has been added. Signed-off-by: Andy Parkins <andyparkins@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>