{"thread":{"id":"7242","subject":"[PATCH] Make gc a builtin.","startedAt":"2007-03-14T01:58:22Z","lastAt":"2007-03-14T12:19:21Z","messageCount":10,"participants":["James Bowes","Shawn O. Pearce","Junio C Hamano","Theodore Tso","Santi Béjar","Andy Parkins","Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"37050","messageId":"11738375021267-git-send-email-jbowes@dangerouslyinc.com","threadId":"7242","inReplyTo":null,"subject":"[PATCH] Make gc a builtin.","fromName":"James Bowes","fromEmail":"jbowes@dangerouslyinc.com","sentAt":"2007-03-14T01:58:22Z","receivedAt":"2007-03-14T01:58:22Z","isPatch":true,"sender":{"key":"jbowes@dangerouslyinc.com","avatar":"https://gravatar.com/avatar/a2fe98c66b2b47a9fa9d2ba92ff949d54c3208b1f8acc2e745b4b84ae3c4483a?d=mp&s=160"},"body":"Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>\n---\n\nOn 3/13/07, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> If you say \"return error(...);\", there is _no_ way that multiple error\n> messages are printed out.\n\nYeah, I wasn't testing well enough. If you pass the name of a non-existant\ncommand to run_command, then it will print out a message about not being able\nto exec. That's not going to help when the command runs but does something bad.\nSo here's the patch with error().\n\n-James\n\n Makefile     |    3 +-\n builtin-gc.c |   78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n builtin.h    |    1 +\n git-gc.sh    |   37 ---------------------------\n git.c        |    1 +\n 5 files changed, 82 insertions(+), 38 deletions(-)\n create mode 100644 builtin-gc.c\n delete mode 100755 git-gc.sh\n\ndiff --git a/Makefile b/Makefile\nindex 9b31565..1ccd52f 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -177,7 +177,7 @@ BASIC_LDFLAGS =\n SCRIPT_SH = \\\n \tgit-bisect.sh git-checkout.sh \\\n \tgit-clean.sh git-clone.sh git-commit.sh \\\n-\tgit-fetch.sh git-gc.sh \\\n+\tgit-fetch.sh \\\n \tgit-ls-remote.sh \\\n \tgit-merge-one-file.sh git-parse-remote.sh \\\n \tgit-pull.sh git-rebase.sh \\\n@@ -297,6 +297,7 @@ BUILTIN_OBJS = \\\n \tbuiltin-fmt-merge-msg.o \\\n \tbuiltin-for-each-ref.o \\\n \tbuiltin-fsck.o \\\n+\tbuiltin-gc.o \\\n \tbuiltin-grep.o \\\n \tbuiltin-init-db.o \\\n \tbuiltin-log.o \\\ndiff --git a/builtin-gc.c b/builtin-gc.c\nnew file mode 100644\nindex 0000000..3b1f8c2\n--- /dev/null\n+++ b/builtin-gc.c\n@@ -0,0 +1,78 @@\n+/*\n+ * git gc builtin command\n+ *\n+ * Cleanup unreachable files and optimize the repository.\n+ *\n+ * Copyright (c) 2007 James Bowes\n+ *\n+ * Based on git-gc.sh, which is\n+ *\n+ * Copyright (c) 2006 Shawn O. Pearce\n+ */\n+\n+#include \"cache.h\"\n+#include \"run-command.h\"\n+\n+#define FAILED_RUN \"failed to run %s\"\n+\n+static const char builtin_gc_usage[] = \"git-gc [--prune]\";\n+\n+static int pack_refs = -1;\n+\n+static const char *argv_pack_refs[] = {\"pack-refs\", \"--prune\", NULL};\n+static const char *argv_reflog[] = {\"reflog\", \"expire\", \"--all\", NULL};\n+static const char *argv_repack[] = {\"repack\", \"-a\", \"-d\", \"-l\", NULL};\n+static const char *argv_prune[] = {\"prune\", NULL};\n+static const char *argv_rerere[] = {\"rerere\", \"gc\", NULL};\n+\n+static int gc_config(const char *var, const char *value)\n+{\n+\tif (!strcmp(var, \"gc.packrefs\")) {\n+\t\tif (!strcmp(value, \"notbare\"))\n+\t\t\tpack_refs = -1;\n+\t\telse\n+\t\t\tpack_refs = git_config_bool(var, value);\n+\t\treturn 0;\n+\t}\n+\treturn git_default_config(var, value);\n+}\n+\n+int cmd_gc(int argc, const char **argv, const char *prefix)\n+{\n+\tint i;\n+\tint prune = 0;\n+\n+\tgit_config(gc_config);\n+\n+\tif (pack_refs < 0)\n+\t\tpack_refs = !is_bare_repository();\n+\n+\tfor (i = 1; i < argc; i++) {\n+\t\tconst char *arg = argv[i];\n+\t\tif (!strcmp(arg, \"--prune\")) {\n+\t\t\tprune = 1;\n+\t\t\tcontinue;\n+\t\t}\n+\t\t/* perhaps other parameters later... */\n+\t\tbreak;\n+\t}\n+\tif (i != argc)\n+\t\tusage(builtin_gc_usage);\n+\n+\tif (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))\n+\t\treturn error(FAILED_RUN, argv_pack_refs[0]);\n+\n+\tif (run_command_v_opt(argv_reflog, RUN_GIT_CMD))\n+\t\treturn error(FAILED_RUN, argv_reflog[0]);\n+\n+\tif (run_command_v_opt(argv_repack, RUN_GIT_CMD))\n+\t\treturn error(FAILED_RUN, argv_repack[0]);\n+\n+\tif (prune && run_command_v_opt(argv_prune, RUN_GIT_CMD))\n+\t\treturn error(FAILED_RUN, argv_prune[0]);\n+\n+\tif (run_command_v_opt(argv_rerere, RUN_GIT_CMD))\n+\t\treturn error(FAILED_RUN, argv_rerere[0]);\n+\n+\treturn 0;\n+}\ndiff --git a/builtin.h b/builtin.h\nindex 1cb64b7..af203e9 100644\n--- a/builtin.h\n+++ b/builtin.h\n@@ -37,6 +37,7 @@ extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);\n extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);\n extern int cmd_format_patch(int argc, const char **argv, const char *prefix);\n extern int cmd_fsck(int argc, const char **argv, const char *prefix);\n+extern int cmd_gc(int argc, const char **argv, const char *prefix);\n extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);\n extern int cmd_grep(int argc, const char **argv, const char *prefix);\n extern int cmd_help(int argc, const char **argv, const char *prefix);\ndiff --git a/git-gc.sh b/git-gc.sh\ndeleted file mode 100755\nindex 436d7ca..0000000\n--- a/git-gc.sh\n+++ /dev/null\n@@ -1,37 +0,0 @@\n-#!/bin/sh\n-#\n-# Copyright (c) 2006, Shawn O. Pearce\n-#\n-# Cleanup unreachable files and optimize the repository.\n-\n-USAGE='[--prune]'\n-SUBDIRECTORY_OK=Yes\n-. git-sh-setup\n-\n-no_prune=:\n-while case $# in 0) break ;; esac\n-do\n-\tcase \"$1\" in\n-\t--prune)\n-\t\tno_prune=\n-\t\t;;\n-\t--)\n-\t\tusage\n-\t\t;;\n-\tesac\n-\tshift\n-done\n-\n-case \"$(git config --get gc.packrefs)\" in\n-notbare|\"\")\n-\ttest $(is_bare_repository) = true || pack_refs=true;;\n-*)\n-\tpack_refs=$(git config --bool --get gc.packrefs)\n-esac\n-\n-test \"true\" != \"$pack_refs\" ||\n-git-pack-refs --prune &&\n-git-reflog expire --all &&\n-git-repack -a -d -l &&\n-$no_prune git-prune &&\n-git-rerere gc || exit\ndiff --git a/git.c b/git.c\nindex dde4d07..ed1c65e 100644\n--- a/git.c\n+++ b/git.c\n@@ -249,6 +249,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)\n \t\t{ \"format-patch\", cmd_format_patch, RUN_SETUP },\n \t\t{ \"fsck\", cmd_fsck, RUN_SETUP },\n \t\t{ \"fsck-objects\", cmd_fsck, RUN_SETUP },\n+\t\t{ \"gc\", cmd_gc, RUN_SETUP },\n \t\t{ \"get-tar-commit-id\", cmd_get_tar_commit_id },\n \t\t{ \"grep\", cmd_grep, RUN_SETUP | USE_PAGER },\n \t\t{ \"help\", cmd_help },\n-- \n1.5.0.2\n"},{"id":"37054","messageId":"20070314060727.GC20978@spearce.org","threadId":"7242","inReplyTo":"11738375021267-git-send-email-jbowes@dangerouslyinc.com","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2007-03-14T06:07:27Z","receivedAt":"2007-03-14T06:07:27Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"James Bowes <jbowes@dangerouslyinc.com> wrote:\n> Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>\n\nACK.  Very nicely done.\n\n...\n> +\tif (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))\n> +\t\treturn error(FAILED_RUN, argv_pack_refs[0]);\n> +\n> +\tif (run_command_v_opt(argv_reflog, RUN_GIT_CMD))\n> +\t\treturn error(FAILED_RUN, argv_reflog[0]);\n> +\n> +\tif (run_command_v_opt(argv_repack, RUN_GIT_CMD))\n> +\t\treturn error(FAILED_RUN, argv_repack[0]);\n> +\n> +\tif (prune && run_command_v_opt(argv_prune, RUN_GIT_CMD))\n> +\t\treturn error(FAILED_RUN, argv_prune[0]);\n> +\n> +\tif (run_command_v_opt(argv_rerere, RUN_GIT_CMD))\n> +\t\treturn error(FAILED_RUN, argv_rerere[0]);\n\nAnd isn't the above so much more readable than this mess?\n\n> -test \"true\" != \"$pack_refs\" ||\n> -git-pack-refs --prune &&\n> -git-reflog expire --all &&\n> -git-repack -a -d -l &&\n> -$no_prune git-prune &&\n> -git-rerere gc || exit\n\nWhich is why I like builtins, and why I think Dscho does too.\n\n-- \nShawn.\n"},{"id":"37058","messageId":"7vodmwfg2c.fsf@assigned-by-dhcp.cox.net","threadId":"7242","inReplyTo":"20070314060727.GC20978@spearce.org","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-03-14T07:19:07Z","receivedAt":"2007-03-14T07:19:07Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Shawn O. Pearce\" <spearce@spearce.org> writes:\n\n> James Bowes <jbowes@dangerouslyinc.com> wrote:\n>> Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>\n>\n> ACK.  Very nicely done.\n\nPerhaps.  But we lost another sample script which made an entry\nbarrier higher to a new person.\n\n>> +\tif (run_command_v_opt(argv_rerere, RUN_GIT_CMD))\n>> +\t\treturn error(FAILED_RUN, argv_rerere[0]);\n>\n> And isn't the above so much more readable than this mess?\n>\n>> -test \"true\" != \"$pack_refs\" ||\n>> -git-pack-refs --prune &&\n>> -git-reflog expire --all &&\n>> -git-repack -a -d -l &&\n>> ...\n\nI do not necessarily think so.  This is not even a performance\ncritical part of the system, so if there _were_ no other\nconstraints, I would rather keep scripts like this as scripts.\n\nFor things like this, scripts are much easier to read,\nunderstand and futz with, and command lists chained with && in\nshell scripts are very nice and compact way to express what is\ngoing on.\n\nThis is especially true if you have some specialized needs, if\nyou do not expect you need to keep that change forever, and if\nyou are lazy.  For example, if you have a repository that you\nfor some reason need to keep available to older dumb transport\nclients for now, you would disable \"git-pack-refs --prune\" line\nfrom your copy of the script version.  No need to recompile.\n\nAnother example is git-repack script.  When you have a\nspecialized repacking needs (say, repack from a specific\nrevision to make a .keep pack to avoid future excessive\nrepacking), being able to check how the plumbing is used in\ngit-repack script and run customized version of it is very\nhandy.  Once you rewrite it to sequence of\n\n\tif (run_command_v_opt(blech, RUN_GIT_CMD))\n        \t...\n\nit becomes much harder to learn what the shell command\nequivalent that would suit your needs would be, and we would\nlose another command that would serve as a good example.\n\nWe are doing built-in _only_ because people on some platforms\ncannot sanely use POSIX shell scripts.  I do not reject these\n\"make X built-in\" patches (when X is perfectly fine as a shell\nscript) because I sympathize with people stuck on Windows, not\nbecause I think built-in is easier to read nor work with than\nscripts.  There is a downside.\n"},{"id":"37059","messageId":"20070314074440.GC12710@thunk.org","threadId":"7242","inReplyTo":"7vodmwfg2c.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Theodore Tso","fromEmail":"tytso@mit.edu","sentAt":"2007-03-14T07:44:40Z","receivedAt":"2007-03-14T07:44:40Z","isPatch":true,"sender":{"key":"tytso@mit.edu","avatar":"https://avatars.githubusercontent.com/u/51416?v=4"},"body":"On Wed, Mar 14, 2007 at 12:19:07AM -0700, Junio C Hamano wrote:\n> >> -test \"true\" != \"$pack_refs\" ||\n> >> -git-pack-refs --prune &&\n> >> -git-reflog expire --all &&\n> >> -git-repack -a -d -l &&\n> >> ...\n> \n> I do not necessarily think so.  This is not even a performance\n> critical part of the system, so if there _were_ no other\n> constraints, I would rather keep scripts like this as scripts.\n\nI agree with Junio; I think the scripts are much more readable and\neasier to understand; In fact, it would be nice if the script were\npreserved somewhere, perhaps as comments in the .c file.\n\n\t\t\t\t\t\t- Ted\n"},{"id":"37061","messageId":"8aa486160703140055s2b03c2aeu1c85dedac59b664b@mail.gmail.com","threadId":"7242","inReplyTo":"20070314074440.GC12710@thunk.org","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Santi Béjar","fromEmail":"sbejar@gmail.com","sentAt":"2007-03-14T07:55:05Z","receivedAt":"2007-03-14T07:55:05Z","isPatch":true,"sender":{"key":"santi@agolina.net","avatar":null},"body":"On 3/14/07, Theodore Tso <tytso@mit.edu> wrote:\n> On Wed, Mar 14, 2007 at 12:19:07AM -0700, Junio C Hamano wrote:\n> > >> -test \"true\" != \"$pack_refs\" ||\n> > >> -git-pack-refs --prune &&\n> > >> -git-reflog expire --all &&\n> > >> -git-repack -a -d -l &&\n> > >> ...\n> >\n> > I do not necessarily think so.  This is not even a performance\n> > critical part of the system, so if there _were_ no other\n> > constraints, I would rather keep scripts like this as scripts.\n>\n> I agree with Junio; I think the scripts are much more readable and\n> easier to understand; In fact, it would be nice if the script were\n> preserved somewhere, perhaps as comments in the .c file.\n>\n\nOr move them to contrib/examples, as was done with git-resolve.sh.\n\nSanti\n"},{"id":"37070","messageId":"7vodmwcgvc.fsf@assigned-by-dhcp.cox.net","threadId":"7242","inReplyTo":"8aa486160703140055s2b03c2aeu1c85dedac59b664b@mail.gmail.com","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-03-14T09:29:59Z","receivedAt":"2007-03-14T09:29:59Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Santi Béjar\" <sbejar@gmail.com> writes:\n\n> On 3/14/07, Theodore Tso <tytso@mit.edu> wrote:\n>> On Wed, Mar 14, 2007 at 12:19:07AM -0700, Junio C Hamano wrote:\n>> > >> -test \"true\" != \"$pack_refs\" ||\n>> > >> -git-pack-refs --prune &&\n>> > >> -git-reflog expire --all &&\n>> > >> -git-repack -a -d -l &&\n>> > >> ...\n>> >\n>> > I do not necessarily think so.  This is not even a performance\n>> > critical part of the system, so if there _were_ no other\n>> > constraints, I would rather keep scripts like this as scripts.\n>>\n>> I agree with Junio; I think the scripts are much more readable and\n>> easier to understand; In fact, it would be nice if the script were\n>> preserved somewhere, perhaps as comments in the .c file.\n>>\n>\n> Or move them to contrib/examples, as was done with git-resolve.sh.\n>\n> Santi\n\nThat probably is a sensible thing to do.  I'll amend the patch.\n"},{"id":"37075","messageId":"200703141045.58739.andyparkins@gmail.com","threadId":"7242","inReplyTo":"20070314074440.GC12710@thunk.org","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Andy Parkins","fromEmail":"andyparkins@gmail.com","sentAt":"2007-03-14T10:45:55Z","receivedAt":"2007-03-14T10:45:55Z","isPatch":true,"sender":{"key":"andyparkins@gmail.com","avatar":null},"body":"On Wednesday 2007 March 14 07:44, Theodore Tso wrote:\n\n> I agree with Junio; I think the scripts are much more readable and\n> easier to understand; In fact, it would be nice if the script were\n> preserved somewhere, perhaps as comments in the .c file.\n\nIf only there were some tool that would keep collections of files as a \nsnapshotted whole and allow us to browse the history of those snapshots in \nsome sort of connected graph, with each snapshot being given some sort of \nunique ID.  Then we could simply refer to that unique ID when we wanted to \ntell someone about a particular historical instance.\n\n:-)\n\n\n\nAndy\n-- \nDr Andy Parkins, M Eng (hons), MIET\nandyparkins@gmail.com\n"},{"id":"37076","messageId":"7vps7caxjb.fsf@assigned-by-dhcp.cox.net","threadId":"7242","inReplyTo":"200703141045.58739.andyparkins@gmail.com","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-03-14T11:12:56Z","receivedAt":"2007-03-14T11:12:56Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Andy Parkins <andyparkins@gmail.com> writes:\n\n> On Wednesday 2007 March 14 07:44, Theodore Tso wrote:\n>\n>> I agree with Junio; I think the scripts are much more readable and\n>> easier to understand; In fact, it would be nice if the script were\n>> preserved somewhere, perhaps as comments in the .c file.\n>\n> If only there were some tool that would keep collections of files as a \n> snapshotted whole and allow us to browse the history of those snapshots in \n> some sort of connected graph, with each snapshot being given some sort of \n> unique ID.  Then we could simply refer to that unique ID when we wanted to \n> tell someone about a particular historical instance.\n>\n> :-)\n\nThere is a difference between having a readily greppable and\nlessable copy handy to study at your own initiative, and being\nable to retrieve to review only after being told.\n\nYou could argue that we can all do that with git-grep and\ngit-less ;-).\n"},{"id":"37080","messageId":"200703141148.12364.andyparkins@gmail.com","threadId":"7242","inReplyTo":"7vps7caxjb.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Andy Parkins","fromEmail":"andyparkins@gmail.com","sentAt":"2007-03-14T11:48:06Z","receivedAt":"2007-03-14T11:48:06Z","isPatch":true,"sender":{"key":"andyparkins@gmail.com","avatar":null},"body":"On Wednesday 2007 March 14 11:12, Junio C Hamano wrote:\n\n> There is a difference between having a readily greppable and\n> lessable copy handy to study at your own initiative, and being\n> able to retrieve to review only after being told.\n\nWell I was only joking really.\n\n> You could argue that we can all do that with git-grep and\n> git-less ;-).\n\nDefinitely.  git is so good at this sort of stuff that encouraging the \nretention of commented out code is just filling up source files with junk.\n\nIn the old days, before version control, I would often have files with\n\n#if 0\n// This is how I used to do it\n// ...\n#endif\n\nThese days I comment it out, then after a few successful commits it gets \nremoved from the source file.  Git makes my code cleaner and clearer as it's \nnot filled with obsolete junk.  I am always secure in the knowledge that I \ncan go back and look if I want.  The same is true, I think, for shell script \nreplaced with C code.\n\nWhat will you do if in the future the C gets a feature that wasn't in the \nshell code - should the shell code be updated?  If you don't then the comment \nis a lie, if you do then it's a maintenance nightmare.\n\nChuck it and be happy it's chucked.  A rule for life.  I should write fortune \ncookies.\n\n\n\nAndy\n-- \nDr Andy Parkins, M Eng (hons), MIET\nandyparkins@gmail.com\n"},{"id":"37082","messageId":"Pine.LNX.4.63.0703141314140.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"7242","inReplyTo":"7vps7caxjb.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] Make gc a builtin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-03-14T12:19:21Z","receivedAt":"2007-03-14T12:19:21Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Wed, 14 Mar 2007, Junio C Hamano wrote:\n\n> Andy Parkins <andyparkins@gmail.com> writes:\n> \n> > On Wednesday 2007 March 14 07:44, Theodore Tso wrote:\n> >\n> >> I agree with Junio; I think the scripts are much more readable and\n> >> easier to understand; In fact, it would be nice if the script were\n> >> preserved somewhere, perhaps as comments in the .c file.\n> >\n> > If only there were some tool that would keep collections of files as a \n> > snapshotted whole and allow us to browse the history of those snapshots in \n> > some sort of connected graph, with each snapshot being given some sort of \n> > unique ID.  Then we could simply refer to that unique ID when we wanted to \n> > tell someone about a particular historical instance.\n> >\n> > :-)\n> \n> There is a difference between having a readily greppable and\n> lessable copy handy to study at your own initiative, and being\n> able to retrieve to review only after being told.\n> \n> You could argue that we can all do that with git-grep and\n> git-less ;-).\n\nNot to forget git-checkout.\n\nBut I like the idea of contrib/examples/. Why not put more stuff there, \ninstead of clinging onto scripts for core-git? The purpose of \ncontrib/examples/ is to provide easy samples, and the purpose of core-git \nis _not_ to provide easy examples, but a consistent and portable set of \nprograms.\n\nAls, when reading Git's scripts, I often think\n\n- wow, what a different style from my one, and\n- would locking not be a nice thing?\n\nBut I guess that now that the King Penguin spoke, I no longer have to \nargue for more builtins, even if they are trivial. (Who knows, maybe we \ncan ship _one_ program, which is then hard linked to git-*, soon?)\n\nCiao,\nDscho\n"}]}