]> gitweb.ps.run Git - ps-cgit/commitdiff
Merge branch 'jo/dirlink'
authorLars Hjemli <hjemli@gmail.com>
Mon, 3 Sep 2007 21:00:06 +0000 (23:00 +0200)
committerLars Hjemli <hjemli@gmail.com>
Mon, 3 Sep 2007 21:00:06 +0000 (23:00 +0200)
* jo/dirlink:
  Rename dirlink to gitlink.

Conflicts:

ui-tree.c

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
1  2 
ui-diff.c
ui-tree.c

diff --combined ui-diff.c
index a76a234cfe61b1fd63a7a3ccc1eb01ad6018b435,4695e3a6442cb1b7bc1e2bbc75291e066d24a013..0be845fa41241656e936c2cab4704663c61fa66f
+++ b/ui-diff.c
@@@ -37,7 -37,7 +37,7 @@@ static void header(unsigned char *sha1
        char *abbrev1, *abbrev2;
        int subproject;
  
-       subproject = (S_ISDIRLNK(mode1) || S_ISDIRLNK(mode2));
+       subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
        html("<div class='head'>");
        html("diff --git a/");
        html_txt(path1);
@@@ -78,10 -78,10 +78,10 @@@ static void filepair_cb(struct diff_fil
  {
        header(pair->one->sha1, pair->one->path, pair->one->mode,
               pair->two->sha1, pair->two->path, pair->two->mode);
-       if (S_ISDIRLNK(pair->one->mode) || S_ISDIRLNK(pair->two->mode)) {
-               if (S_ISDIRLNK(pair->one->mode))
+       if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
+               if (S_ISGITLINK(pair->one->mode))
                        print_line(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
-               if (S_ISDIRLNK(pair->two->mode))
+               if (S_ISGITLINK(pair->two->mode))
                        print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
                return;
        }
                cgit_print_error("Error running diff");
  }
  
 -void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, char *path)
 +void cgit_print_diff(const char *new_rev, const char *old_rev)
  {
        unsigned char sha1[20], sha2[20];
        enum object_type type;
        unsigned long size;
 -      struct commit *commit;
 -
 -      if (head && !old_hex && !new_hex) {
 -              get_sha1(head, sha1);
 -              commit = lookup_commit_reference(sha1);
 -              if (commit && !parse_commit(commit)) {
 -                      html("<table class='diff'>");
 -                      html("<tr><td>");
 -                      cgit_diff_commit(commit, filepair_cb);
 -                      html("</td></tr>");
 -                      html("</table>");
 -              }
 +      struct commit *commit, *commit2;
 +
 +      if (!new_rev)
 +              new_rev = cgit_query_head;
 +      get_sha1(new_rev, sha1);
 +      type = sha1_object_info(sha1, &size);
 +      if (type == OBJ_BAD) {
 +              cgit_print_error(fmt("Bad object name: %s", new_rev));
 +              return;
 +      }
 +      if (type != OBJ_COMMIT) {
 +              cgit_print_error(fmt("Unhandled object type: %s",
 +                                   typename(type)));
                return;
        }
  
 -      get_sha1(old_hex, sha1);
 -      get_sha1(new_hex, sha2);
 +      commit = lookup_commit_reference(sha1);
 +      if (!commit || parse_commit(commit))
 +              cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha1)));
  
 -      type = sha1_object_info(sha1, &size);
 -      if (type == OBJ_BAD) {
 +      if (old_rev)
 +              get_sha1(old_rev, sha2);
 +      else if (commit->parents && commit->parents->item)
 +              hashcpy(sha2, commit->parents->item->object.sha1);
 +      else
 +              hashclr(sha2);
 +
 +      if (!is_null_sha1(sha2)) {
                type = sha1_object_info(sha2, &size);
                if (type == OBJ_BAD) {
 -                      cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex));
 +                      cgit_print_error(fmt("Bad object name: %s", sha1_to_hex(sha2)));
                        return;
                }
 +              commit2 = lookup_commit_reference(sha2);
 +              if (!commit2 || parse_commit(commit2))
 +                      cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha2)));
        }
  
        html("<table class='diff'>");
 -      switch(type) {
 -      case OBJ_BLOB:
 -              html("<tr><td>");
 -              header(sha1, path, 0644, sha2, path, 0644);
 -              if (cgit_diff_files(sha1, sha2, print_line))
 -                      cgit_print_error("Error running diff");
 -              html("</td></tr>");
 -              break;
 -      case OBJ_TREE:
 -              cgit_diff_tree(sha1, sha2, filepair_cb);
 -              break;
 -      default:
 -              cgit_print_error(fmt("Unhandled object type: %s",
 -                                   typename(type)));
 -              break;
 -      }
 +      html("<tr><td>");
 +      cgit_diff_tree(sha2, sha1, filepair_cb);
 +      html("</td></tr>");
        html("</table>");
  }
diff --combined ui-tree.c
index 634132f8d4554647cc4a87e46ad6fcb3d899a2aa,21dd533cf8edfb9432cd8a88d9f5d762340e7462..1cb09f717a56826dfd2cb132cdd78f72c3aad341
+++ b/ui-tree.c
  #include "cgit.h"
  
  char *curr_rev;
 +char *match_path;
 +int header = 0;
  
 -static int print_entry(const unsigned char *sha1, const char *base,
 -                     int baselen, const char *pathname, unsigned int mode,
 -                     int stage)
 +static void print_object(const unsigned char *sha1, char *path)
 +{
 +      enum object_type type;
 +      unsigned char *buf;
 +      unsigned long size, lineno, start, idx;
 +
 +      type = sha1_object_info(sha1, &size);
 +      if (type == OBJ_BAD) {
 +              cgit_print_error(fmt("Bad object name: %s",
 +                                   sha1_to_hex(sha1)));
 +              return;
 +      }
 +
 +      buf = read_sha1_file(sha1, &type, &size);
 +      if (!buf) {
 +              cgit_print_error(fmt("Error reading object %s",
 +                                   sha1_to_hex(sha1)));
 +              return;
 +      }
 +
 +      html(" blob: <a href='");
 +      html_attr(cgit_pageurl(cgit_query_repo, "blob", fmt("id=%s", sha1_to_hex(sha1))));
 +      htmlf("'>%s</a>",sha1_to_hex(sha1));
 +
 +      html("<table class='blob'>\n");
 +      idx = 0;
 +      start = 0;
 +      lineno = 0;
 +      while(idx < size) {
 +              if (buf[idx] == '\n') {
 +                      buf[idx] = '\0';
 +                      htmlf("<tr><td class='no'><a name='%d'>%1$d</a></td><td class='txt'>",
 +                            ++lineno);
 +                      html_txt(buf + start);
 +                      html("</td></tr>\n");
 +                      start = idx + 1;
 +              }
 +              idx++;
 +      }
 +      html("</table>\n");
 +}
 +
 +
 +static int ls_item(const unsigned char *sha1, const char *base, int baselen,
 +                 const char *pathname, unsigned int mode, int stage)
  {
        char *name;
 +      char *fullpath;
        enum object_type type;
        unsigned long size = 0;
  
        name = xstrdup(pathname);
 +      fullpath = fmt("%s%s%s", cgit_query_path ? cgit_query_path : "",
 +                     cgit_query_path ? "/" : "", name);
 +
        type = sha1_object_info(sha1, &size);
-       if (type == OBJ_BAD && !S_ISDIRLNK(mode)) {
+       if (type == OBJ_BAD && !S_ISGITLINK(mode)) {
                htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
                      name,
                      sha1_to_hex(sha1));
                return 0;
        }
 -      html("<tr><td class='filemode'>");
 +
 +      html("<tr><td class='ls-mode'>");
        html_filemode(mode);
 -      html("</td><td ");
 +      html("</td><td>");
-       if (S_ISDIRLNK(mode)) {
+       if (S_ISGITLINK(mode)) {
 -              htmlf("class='ls-mod'><a href='");
 +              htmlf("<a class='ls-mod' href='");
                html_attr(fmt(cgit_repo->module_link,
                              name,
                              sha1_to_hex(sha1)));
 +              html("'>");
 +              html_txt(name);
 +              html("</a>");
        } else if (S_ISDIR(mode)) {
 -              html("class='ls-dir'><a href='");
 -              html_attr(cgit_pageurl(cgit_query_repo, "tree",
 -                                     fmt("h=%s&amp;id=%s&amp;path=%s%s/",
 -                                         curr_rev,
 -                                         sha1_to_hex(sha1),
 -                                         cgit_query_path ? cgit_query_path : "",
 -                                         pathname)));
 +              cgit_tree_link(name, NULL, "ls-dir", cgit_query_head,
 +                             curr_rev, fullpath);
        } else {
 -              html("class='ls-blob'><a href='");
 -              html_attr(cgit_pageurl(cgit_query_repo, "view",
 -                                    fmt("h=%s&amp;id=%s&amp;path=%s%s", curr_rev,
 -                                        sha1_to_hex(sha1),
 -                                        cgit_query_path ? cgit_query_path : "",
 -                                        pathname)));
 +              cgit_tree_link(name, NULL, "ls-blob", cgit_query_head,
 +                             curr_rev, fullpath);
        }
 -      htmlf("'>%s</a></td>", name);
 -      htmlf("<td class='filesize'>%li</td>", size);
 -
 -      html("<td class='links'><a href='");
 -      html_attr(cgit_pageurl(cgit_query_repo, "log",
 -                             fmt("h=%s&amp;path=%s%s",
 -                                 curr_rev,
 -                                 cgit_query_path ? cgit_query_path : "",
 -                                 pathname)));
 -      html("'>history</a></td>");
 -      html("</tr>\n");
 +      htmlf("</td><td class='ls-size'>%li</td>", size);
 +
 +      html("<td>");
 +      cgit_log_link("log", NULL, "button", cgit_query_head, curr_rev,
 +                    fullpath, 0);
 +      html("</td></tr>\n");
        free(name);
        return 0;
  }
  
 -void cgit_print_tree(const char *rev, const char *hex, char *path)
 +static void ls_head()
 +{
 +      html("<table class='list'>\n");
 +      html("<tr class='nohover'>");
 +      html("<th class='left'>Mode</th>");
 +      html("<th class='left'>Name</th>");
 +      html("<th class='right'>Size</th>");
 +      html("<th/>");
 +      html("</tr>\n");
 +      header = 1;
 +}
 +
 +static void ls_tail()
 +{
 +      if (!header)
 +              return;
 +      html("</table>\n");
 +      header = 0;
 +}
 +
 +static void ls_tree(const unsigned char *sha1, char *path)
  {
        struct tree *tree;
 +
 +      tree = parse_tree_indirect(sha1);
 +      if (!tree) {
 +              cgit_print_error(fmt("Not a tree object: %s",
 +                                   sha1_to_hex(sha1)));
 +              return;
 +      }
 +
 +      ls_head();
 +      read_tree_recursive(tree, "", 0, 1, NULL, ls_item);
 +      ls_tail();
 +}
 +
 +
 +static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
 +                   const char *pathname, unsigned mode, int stage)
 +{
 +      static int state;
 +      static char buffer[PATH_MAX];
 +      char *url;
 +
 +      if (state == 0) {
 +              memcpy(buffer, base, baselen);
 +              strcpy(buffer+baselen, pathname);
 +              url = cgit_pageurl(cgit_query_repo, "tree",
 +                                 fmt("h=%s&amp;path=%s", curr_rev, buffer));
 +              html("/");
 +              cgit_tree_link(xstrdup(pathname), NULL, NULL, cgit_query_head,
 +                             curr_rev, buffer);
 +
 +              if (strcmp(match_path, buffer))
 +                      return READ_TREE_RECURSIVE;
 +
 +              if (S_ISDIR(mode)) {
 +                      state = 1;
 +                      ls_head();
 +                      return READ_TREE_RECURSIVE;
 +              } else {
 +                      print_object(sha1, buffer);
 +                      return 0;
 +              }
 +      }
 +      ls_item(sha1, base, baselen, pathname, mode, stage);
 +      return 0;
 +}
 +
 +
 +/*
 + * Show a tree or a blob
 + *   rev:  the commit pointing at the root tree object
 + *   path: path to tree or blob
 + */
 +void cgit_print_tree(const char *rev, char *path)
 +{
        unsigned char sha1[20];
        struct commit *commit;
 +      const char *paths[] = {path, NULL};
 +
 +      if (!rev)
 +              rev = cgit_query_head;
  
        curr_rev = xstrdup(rev);
 -      get_sha1(rev, sha1);
 +      if (get_sha1(rev, sha1)) {
 +              cgit_print_error(fmt("Invalid revision name: %s", rev));
 +              return;
 +      }
        commit = lookup_commit_reference(sha1);
        if (!commit || parse_commit(commit)) {
 -              cgit_print_error(fmt("Invalid head: %s", rev));
 +              cgit_print_error(fmt("Invalid commit reference: %s", rev));
                return;
        }
 -      if (!hex)
 -              hex = sha1_to_hex(commit->tree->object.sha1);
  
 -      if (get_sha1_hex(hex, sha1)) {
 -              cgit_print_error(fmt("Invalid object id: %s", hex));
 -              return;
 -      }
 -      tree = parse_tree_indirect(sha1);
 -      if (!tree) {
 -              cgit_print_error(fmt("Not a tree object: %s", hex));
 +      html("path: <a href='");
 +      html_attr(cgit_pageurl(cgit_query_repo, "tree", fmt("h=%s", rev)));
 +      html("'>root</a>");
 +
 +      if (path == NULL) {
 +              ls_tree(commit->tree->object.sha1, NULL);
                return;
        }
  
 -      html_txt(path);
 -      html("<table class='list'>\n");
 -      html("<tr class='nohover'>");
 -      html("<th class='left'>Mode</th>");
 -      html("<th class='left'>Name</th>");
 -      html("<th class='right'>Size</th>");
 -      html("<th/>");
 -      html("</tr>\n");
 -      read_tree_recursive(tree, "", 0, 1, NULL, print_entry);
 -      html("</table>\n");
 +      match_path = path;
 +      read_tree_recursive(commit->tree, NULL, 0, 0, paths, walk_tree);
 +      ls_tail();
  }