Merge branch 'master' into next
authorJunio C Hamano <junkio@cox.net>
Sun, 5 Mar 2006 10:49:34 +0000 (02:49 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 5 Mar 2006 10:49:34 +0000 (02:49 -0800)
* master:
Const tightening.
Documentation/Makefile: Some `git-*.txt' files aren't manpages.
cvsserver: updated documentation

12 files changed:
Documentation/Makefile
Documentation/git-cvsserver.txt
blame.c
exec_cmd.c
exec_cmd.h
git.c
receive-pack.c
run-command.c
run-command.h
send-pack.c
shell.c
upload-pack.c
index a3bca86cb0aeb23ea67658de039c5ab79d66d898..f4cbf7e159be721bf17625b07c1d7b4f36c60f78 100644 (file)
@@ -1,4 +1,7 @@
-MAN1_TXT=$(wildcard git-*.txt) gitk.txt
+MAN1_TXT= \
+       $(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
+               $(wildcard git-*.txt)) \
+       gitk.txt
 MAN7_TXT=git.txt
 
 DOC_HTML=$(patsubst %.txt,%.html,$(MAN1_TXT) $(MAN7_TXT))
@@ -11,6 +14,7 @@ ARTICLES += howto-index
 ARTICLES += repository-layout
 ARTICLES += hooks
 ARTICLES += everyday
+ARTICLES += git-tools
 # with their own formatting rules.
 SP_ARTICLES = glossary howto/revert-branch-rebase
 
index 19c9c51cffec272d675cdaf1b223e2a6dff5dd3b..4dc13c35db48b2a403bcb3899605fa0a2bbd0af0 100644 (file)
@@ -5,14 +5,12 @@ NAME
 ----
 git-cvsserver - A CVS server emulator for git
 
-
 SYNOPSIS
 --------
 [verse]
 export CVS_SERVER=git-cvsserver
 'cvs' -d :ext:user@server/path/repo.git co <HEAD_name>
 
-
 DESCRIPTION
 -----------
 
@@ -27,48 +25,85 @@ plugin. Most functionality works fine with both of these clients.
 
 LIMITATIONS
 -----------
-Currently gitcvs only works over ssh connections.
 
+Currently cvsserver works over SSH connections for read/write clients, and
+over pserver for anonymous CVS access.
+
+CVS clients cannot tag, branch or perform GIT merges.
 
 INSTALLATION
 ------------
-1. Put server.pl somewhere useful on the same machine that is hosting your git repos
+
+1. If you are going to offer anonymous CVS access via pserver, add a line in
+   /etc/inetd.conf like
+
+   cvspserver stream tcp nowait nobody git-cvsserver pserver
+
+   Note: In some cases, you need to pass the 'pserver' argument twice for
+   git-cvsserver to see it. So the line would look like
+
+   cvspserver stream tcp nowait nobody git-cvsserver pserver pserver
+
+   No special setup is needed for SSH access, other than having GIT tools
+   in the PATH. If you have clients that do not accept the CVS_SERVER
+   env variable, you can rename git-cvsserver to cvs.
 
 2. For each repo that you want accessible from CVS you need to edit config in
    the repo and add the following section.
 
    [gitcvs]
         enabled=1
+        # optional for debugging
         logfile=/path/to/logfile
 
-   n.b. you need to ensure each user that is going to invoke server.pl has
-   write access to the log file.
+   Note: you need to ensure each user that is going to invoke git-cvsserver has
+   write access to the log file and to the git repository. When offering anon
+   access via pserver, this means that the nobody user should have write access
+   to at least the sqlite database at the root of the repository.
+
+3. On the client machine you need to set the following variables.
+   CVSROOT should be set as per normal, but the directory should point at the
+   appropriate git repo. For example:
+
+   For SSH access, CVS_SERVER should be set to git-cvsserver
+
+   Example:
 
-5. On each client machine you need to set the following variables.
-     CVSROOT should be set as per normal, but the directory should point at the
-             appropriate git repo.
-     CVS_SERVER should be set to the server.pl script that has been put on the
-                remote machine.
+     export CVSROOT=:ext:user@server:/var/git/project.git
+     export CVS_SERVER=git-cvsserver
 
-6. Clients should now be able to check out modules (where modules are the names
-   of branches in git).
-     $ cvs co -d mylocaldir master
+4. For SSH clients that will make commits, make sure their .bashrc file
+   sets the GIT_AUTHOR and GIT_COMMITTER variables.
+
+5. Clients should now be able to check out the project. Use the CVS 'module'
+   name to indicate what GIT 'head' you want to check out. Example:
+
+     cvs co -d project-master master
 
 Eclipse CVS Client Notes
 ------------------------
 
 To get a checkout with the Eclipse CVS client:
 
-1. Create a new project from CVS checkout, giving it repository and module
-2. Context Menu->Team->Share Project...
-3. Enter the repository and module information again and click Finish
-4. The Synchronize view appears. Untick  "launch commit wizard" to avoid
-committing the .project file, and select HEAD as the tag to synchronize to.
-Update all incoming changes.
-
-Note that most versions of Eclipse ignore CVS_SERVER (which you can set in
-the Preferences->Team->CVS->ExtConnection pane), so you may have to
-rename, alias or symlink git-cvsserver to 'cvs' on the server.
+1. Select "Create a new project -> From CVS checkout"
+2. Create a new location. See the notes below for details on how to choose the
+   right protocol.
+3. Browse the 'modules' available. It will give you a list of the heads in
+   the repository. You will not be able to browse the tree from there. Only
+   the heads.
+4. Pick 'HEAD' when it asks what branch/tag to check out. Untick the
+   "launch commit wizard" to avoid committing the .project file.
+
+Protocol notes: If you are using anonymous acces via pserver, just select that.
+Those using SSH access should choose the 'ext' protocol, and configure 'ext'
+access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to
+'git-cvsserver'. Not that password support is not good when using 'ext',
+you will definitely want to have SSH keys setup.
+
+Alternatively, you can just use the non-standard extssh protocol that Eclipse
+offer. In that case CVS_SERVER is ignored, and you will have to replace
+the cvs utility on the server with git-cvsserver or manipulate your .bashrc
+so that calling 'cvs' effectively calls git-cvsserver.
 
 Clients known to work
 ---------------------
@@ -106,7 +141,7 @@ Authors: Martyn Smith    <martyn@catalyst.net.nz>
 
 Documentation
 --------------
-Documentation by Martyn Smith <martyn@catalyst.net.nz> and Martin Langhoff <martin@catalyst.net.nz>Matthias Urlichs <smurf@smurf.noris.de>.
+Documentation by Martyn Smith <martyn@catalyst.net.nz> and Martin Langhoff <martin@catalyst.net.nz> Matthias Urlichs <smurf@smurf.noris.de>.
 
 GIT
 ---
diff --git a/blame.c b/blame.c
index 7308c36d232e362b64dcb5b2bc60fbe3014bdb28..562940ecedbd4f89aee89b9b4c96e8e2f21451df 100644 (file)
--- a/blame.c
+++ b/blame.c
@@ -226,6 +226,7 @@ static void print_patch(struct patch *p)
        }
 }
 
+#if 0
 /* For debugging only */
 static void print_map(struct commit *cmit, struct commit *other)
 {
@@ -259,6 +260,7 @@ static void print_map(struct commit *cmit, struct commit *other)
                printf("\n");
        }
 }
+#endif
 
 // p is a patch from commit to other.
 static void fill_line_map(struct commit *commit, struct commit *other,
index b5e59a9ae9777183d3110defc2c8964aa0d8b62b..96cc2123b642173bbf7ff38cbea46695357b2c0b 100644 (file)
@@ -29,10 +29,9 @@ const char *git_exec_path(void)
 }
 
 
-int execv_git_cmd(char **argv)
+int execv_git_cmd(const char **argv)
 {
        char git_command[PATH_MAX + 1];
-       char *tmp;
        int len, err, i;
        const char *paths[] = { current_exec_path,
                                getenv("GIT_EXEC_PATH"),
@@ -40,6 +39,8 @@ int execv_git_cmd(char **argv)
 
        for (i = 0; i < sizeof(paths)/sizeof(paths[0]); ++i) {
                const char *exec_dir = paths[i];
+               const char *tmp;
+
                if (!exec_dir) continue;
 
                if (*exec_dir != '/') {
@@ -82,7 +83,7 @@ int execv_git_cmd(char **argv)
                argv[0] = git_command;
 
                /* execve() can only ever return if it fails */
-               execve(git_command, argv, environ);
+               execve(git_command, (char **)argv, environ);
 
                err = errno;
 
@@ -93,11 +94,11 @@ int execv_git_cmd(char **argv)
 }
 
 
-int execl_git_cmd(char *cmd,...)
+int execl_git_cmd(const char *cmd,...)
 {
        int argc;
-       char *argv[MAX_ARGS + 1];
-       char *arg;
+       const char *argv[MAX_ARGS + 1];
+       const char *arg;
        va_list param;
 
        va_start(param, cmd);
index 5150ee29f7a2bef5cd446dbb18de36c4ffa7cce8..989621ff4ecea463c340cb05eb035be0f7cb94a5 100644 (file)
@@ -3,8 +3,8 @@
 
 extern void git_set_exec_path(const char *exec_path);
 extern const char* git_exec_path(void);
-extern int execv_git_cmd(char **argv); /* NULL terminated */
-extern int execl_git_cmd(char *cmd, ...);
+extern int execv_git_cmd(const char **argv); /* NULL terminated */
+extern int execl_git_cmd(const char *cmd, ...);
 
 
 #endif /* __GIT_EXEC_CMD_H_ */
diff --git a/git.c b/git.c
index a547dbd9136c70e49340814d1d57e92ec94c4c3d..164d3e9e4f41869192493d39e93ea4fc34fde4eb 100644 (file)
--- a/git.c
+++ b/git.c
@@ -216,33 +216,33 @@ static void prepend_to_path(const char *dir, int len)
        setenv("PATH", path, 1);
 }
 
-static void show_man_page(char *git_cmd)
+static void show_man_page(const char *git_cmd)
 {
-       char *page;
+       const char *page;
 
        if (!strncmp(git_cmd, "git", 3))
                page = git_cmd;
        else {
                int page_len = strlen(git_cmd) + 4;
-
-               page = malloc(page_len + 1);
-               strcpy(page, "git-");
-               strcpy(page + 4, git_cmd);
-               page[page_len] = 0;
+               char *p = malloc(page_len + 1);
+               strcpy(p, "git-");
+               strcpy(p + 4, git_cmd);
+               p[page_len] = 0;
+               page = p;
        }
 
        execlp("man", "man", page, NULL);
 }
 
-static int cmd_version(int argc, char **argv, char **envp)
+static int cmd_version(int argc, const char **argv, char **envp)
 {
        printf("git version %s\n", GIT_VERSION);
        return 0;
 }
 
-static int cmd_help(int argc, char **argv, char **envp)
+static int cmd_help(int argc, const char **argv, char **envp)
 {
-       char *help_cmd = argv[1];
+       const char *help_cmd = argv[1];
        if (!help_cmd)
                cmd_usage(git_exec_path(), NULL);
        show_man_page(help_cmd);
@@ -251,7 +251,7 @@ static int cmd_help(int argc, char **argv, char **envp)
 
 #define LOGSIZE (65536)
 
-static int cmd_log(int argc, char **argv, char **envp)
+static int cmd_log(int argc, const char **argv, char **envp)
 {
        struct rev_info rev;
        struct commit *commit;
@@ -263,7 +263,7 @@ static int cmd_log(int argc, char **argv, char **envp)
 
        argc = setup_revisions(argc, argv, &rev, "HEAD");
        while (1 < argc) {
-               char *arg = argv[1];
+               const char *arg = argv[1];
                if (!strncmp(arg, "--pretty", 8)) {
                        commit_format = get_commit_format(arg + 8);
                        if (commit_format == CMIT_FMT_ONELINE)
@@ -325,12 +325,12 @@ static int cmd_log(int argc, char **argv, char **envp)
 
 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
 
-static void handle_internal_command(int argc, char **argv, char **envp)
+static void handle_internal_command(int argc, const char **argv, char **envp)
 {
        const char *cmd = argv[0];
        static struct cmd_struct {
                const char *cmd;
-               int (*fn)(int, char **, char **);
+               int (*fn)(int, const char **, char **);
        } commands[] = {
                { "version", cmd_version },
                { "help", cmd_help },
@@ -346,9 +346,9 @@ static void handle_internal_command(int argc, char **argv, char **envp)
        }
 }
 
-int main(int argc, char **argv, char **envp)
+int main(int argc, const char **argv, char **envp)
 {
-       char *cmd = argv[0];
+       const char *cmd = argv[0];
        char *slash = strrchr(cmd, '/');
        char git_command[PATH_MAX + 1];
        const char *exec_path = NULL;
index 2a3db16d684e3d7ec9bbdd5f80266eb1e4af6f64..93929b5371bc0b9578ee5d3cb21c8ae6ade8cd1b 100644 (file)
@@ -6,7 +6,7 @@
 
 static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
 
-static char *unpacker[] = { "unpack-objects", NULL };
+static const char *unpacker[] = { "unpack-objects", NULL };
 
 static int report_status = 0;
 
@@ -177,7 +177,7 @@ static void run_update_post_hook(struct command *cmd)
 {
        struct command *cmd_p;
        int argc;
-       char **argv;
+       const char **argv;
 
        if (access(update_post_hook, X_OK) < 0)
                return;
@@ -190,10 +190,12 @@ static void run_update_post_hook(struct command *cmd)
        argv[0] = update_post_hook;
 
        for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
+               char *p;
                if (cmd_p->error_string)
                        continue;
-               argv[argc] = xmalloc(strlen(cmd_p->ref_name) + 1);
-               strcpy(argv[argc], cmd_p->ref_name);
+               p = xmalloc(strlen(cmd_p->ref_name) + 1);
+               strcpy(p, cmd_p->ref_name);
+               argv[argc] = p;
                argc++;
        }
        argv[argc] = NULL;
index b3d287e97e7d13c1f8d4e8eab5c9af7359ccbc07..ca67ee9333e1f4125678fe607f44d75becc3cf7e 100644 (file)
@@ -3,7 +3,7 @@
 #include <sys/wait.h>
 #include "exec_cmd.h"
 
-int run_command_v_opt(int argc, char **argv, int flags)
+int run_command_v_opt(int argc, const char **argv, int flags)
 {
        pid_t pid = fork();
 
@@ -47,7 +47,7 @@ int run_command_v_opt(int argc, char **argv, int flags)
        }
 }
 
-int run_command_v(int argc, char **argv)
+int run_command_v(int argc, const char **argv)
 {
        return run_command_v_opt(argc, argv, 0);
 }
@@ -55,7 +55,7 @@ int run_command_v(int argc, char **argv)
 int run_command(const char *cmd, ...)
 {
        int argc;
-       char *argv[MAX_RUN_COMMAND_ARGS];
+       const char *argv[MAX_RUN_COMMAND_ARGS];
        const char *arg;
        va_list param;
 
index ef3ee053dee4e60db1887020c8ab8840027ff649..70b477a7483ce3a4997b20ee02223eeb483bde6c 100644 (file)
@@ -13,8 +13,8 @@ enum {
 
 #define RUN_COMMAND_NO_STDIO 1
 #define RUN_GIT_CMD         2  /*If this is to be git sub-command */
-int run_command_v_opt(int argc, char **argv, int opt);
-int run_command_v(int argc, char **argv);
+int run_command_v_opt(int argc, const char **argv, int opt);
+int run_command_v(int argc, const char **argv);
 int run_command(const char *cmd, ...);
 
 #endif
index f5583861433517527943dcefb3320e923fe634a0..c8ffc8d537d68e8296d8112582fd76e5148a9f98 100644 (file)
@@ -27,7 +27,7 @@ static int is_zero_sha1(const unsigned char *sha1)
 
 static void exec_pack_objects(void)
 {
-       static char *args[] = {
+       static const char *args[] = {
                "pack-objects",
                "--stdout",
                NULL
@@ -39,7 +39,7 @@ static void exec_pack_objects(void)
 static void exec_rev_list(struct ref *refs)
 {
        struct ref *ref;
-       static char *args[1000];
+       static const char *args[1000];
        int i = 0, j;
 
        args[i++] = "rev-list"; /* 0 */
diff --git a/shell.c b/shell.c
index fc0c73cde7370801a0695befbf0e2610d2ea7ef1..8c08cf0fb339d293383c3dacb8cdfc805afa3727 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -15,7 +15,7 @@ static int do_generic_cmd(const char *me, char *arg)
        my_argv[1] = arg;
        my_argv[2] = NULL;
 
-       return execv_git_cmd((char**) my_argv);
+       return execv_git_cmd(my_argv);
 }
 
 static struct commands {
index 635abb371d4c86677f091551f731047b4ca08612..47560c9527b9c17db34f10e78d7c1f0d99b746e1 100644 (file)
@@ -46,7 +46,7 @@ static void create_pack_file(void)
        if (!pid) {
                int i;
                int args;
-               char **argv;
+               const char **argv;
                char *buf;
                char **p;
 
@@ -56,9 +56,9 @@ static void create_pack_file(void)
                }
                else
                        args = nr_has + nr_needs + 5;
-               argv = xmalloc(args * sizeof(char *));
+               p = xmalloc(args * sizeof(char *));
+               argv = (const char **) p;
                buf = xmalloc(args * 45);
-               p = argv;
 
                dup2(fd[1], 1);
                close(0);