Code

Merge branch 'tr/maint-bundle-long-subject'
authorJunio C Hamano <gitster@pobox.com>
Mon, 27 Feb 2012 07:05:51 +0000 (23:05 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Feb 2012 07:05:51 +0000 (23:05 -0800)
* tr/maint-bundle-long-subject:
  t5704: match tests to modern style
  strbuf: improve strbuf_get*line documentation
  bundle: use a strbuf to scan the log for boundary commits
  bundle: put strbuf_readline_fd in strbuf.c with adjustments

1  2 
bundle.c
strbuf.c
strbuf.h

diff --combined bundle.c
index b8acf3c18b600f1f413f95744ad281e3879b3f6e,4497343e561437ef98d9c45d83a312e942eeeade..7a760db2fc4ab2a807bead051edbf53182c8326a
+++ b/bundle.c
@@@ -23,23 -23,6 +23,6 @@@ static void add_to_ref_list(const unsig
        list->nr++;
  }
  
- /* Eventually this should go to strbuf.[ch] */
- static int strbuf_readline_fd(struct strbuf *sb, int fd)
- {
-       strbuf_reset(sb);
-       while (1) {
-               char ch;
-               ssize_t len = xread(fd, &ch, 1);
-               if (len <= 0)
-                       return len;
-               strbuf_addch(sb, ch);
-               if (ch == '\n')
-                       break;
-       }
-       return 0;
- }
  static int parse_bundle_header(int fd, struct bundle_header *header,
                               const char *report_path)
  {
@@@ -47,7 -30,7 +30,7 @@@
        int status = 0;
  
        /* The bundle header begins with the signature */
-       if (strbuf_readline_fd(&buf, fd) ||
+       if (strbuf_getwholeline_fd(&buf, fd, '\n') ||
            strcmp(buf.buf, bundle_signature)) {
                if (report_path)
                        error("'%s' does not look like a v2 bundle file",
@@@ -57,7 -40,7 +40,7 @@@
        }
  
        /* The bundle header ends with an empty line */
-       while (!strbuf_readline_fd(&buf, fd) &&
+       while (!strbuf_getwholeline_fd(&buf, fd, '\n') &&
               buf.len && buf.buf[0] != '\n') {
                unsigned char sha1[20];
                int is_prereq = 0;
@@@ -251,7 -234,7 +234,7 @@@ int create_bundle(struct bundle_header 
        const char **argv_boundary = xmalloc((argc + 4) * sizeof(const char *));
        const char **argv_pack = xmalloc(6 * sizeof(const char *));
        int i, ref_count = 0;
-       char buffer[1024];
+       struct strbuf buf = STRBUF_INIT;
        struct rev_info revs;
        struct child_process rls;
        FILE *rls_fout;
        if (start_command(&rls))
                return -1;
        rls_fout = xfdopen(rls.out, "r");
-       while (fgets(buffer, sizeof(buffer), rls_fout)) {
+       while (strbuf_getwholeline(&buf, rls_fout, '\n') != EOF) {
                unsigned char sha1[20];
-               if (buffer[0] == '-') {
-                       write_or_die(bundle_fd, buffer, strlen(buffer));
-                       if (!get_sha1_hex(buffer + 1, sha1)) {
+               if (buf.len > 0 && buf.buf[0] == '-') {
+                       write_or_die(bundle_fd, buf.buf, buf.len);
+                       if (!get_sha1_hex(buf.buf + 1, sha1)) {
                                struct object *object = parse_object(sha1);
                                object->flags |= UNINTERESTING;
-                               add_pending_object(&revs, object, buffer);
+                               add_pending_object(&revs, object, buf.buf);
                        }
-               } else if (!get_sha1_hex(buffer, sha1)) {
+               } else if (!get_sha1_hex(buf.buf, sha1)) {
                        struct object *object = parse_object(sha1);
                        object->flags |= SHOWN;
                }
        }
+       strbuf_release(&buf);
        fclose(rls_fout);
        if (finish_command(&rls))
                return error("rev-list died");
                        continue;
                if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
                        continue;
 -              if (!resolve_ref(e->name, sha1, 1, &flag))
 +              if (read_ref_full(e->name, sha1, 1, &flag))
                        flag = 0;
                display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
  
diff --combined strbuf.c
index ff0b96b4162bd92162a7eb05eee5be7a5ec2b6ba,692cf1bd9a5e7d97d68eb44722afbdd1b59d2cda..5135d5950d9a5ea3ce8064e5491e53da17645da9
+++ b/strbuf.c
@@@ -383,6 -383,22 +383,22 @@@ int strbuf_getline(struct strbuf *sb, F
        return 0;
  }
  
+ int strbuf_getwholeline_fd(struct strbuf *sb, int fd, int term)
+ {
+       strbuf_reset(sb);
+       while (1) {
+               char ch;
+               ssize_t len = xread(fd, &ch, 1);
+               if (len <= 0)
+                       return EOF;
+               strbuf_addch(sb, ch);
+               if (ch == term)
+                       break;
+       }
+       return 0;
+ }
  int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint)
  {
        int fd, len;
  
        return len;
  }
 +
 +void strbuf_add_lines(struct strbuf *out, const char *prefix,
 +                    const char *buf, size_t size)
 +{
 +      while (size) {
 +              const char *next = memchr(buf, '\n', size);
 +              next = next ? (next + 1) : (buf + size);
 +              strbuf_addstr(out, prefix);
 +              strbuf_add(out, buf, next - buf);
 +              size -= next - buf;
 +              buf = next;
 +      }
 +      strbuf_complete_line(out);
 +}
 +
 +static int is_rfc3986_reserved(char ch)
 +{
 +      switch (ch) {
 +              case '!': case '*': case '\'': case '(': case ')': case ';':
 +              case ':': case '@': case '&': case '=': case '+': case '$':
 +              case ',': case '/': case '?': case '#': case '[': case ']':
 +                      return 1;
 +      }
 +      return 0;
 +}
 +
 +static int is_rfc3986_unreserved(char ch)
 +{
 +      return isalnum(ch) ||
 +              ch == '-' || ch == '_' || ch == '.' || ch == '~';
 +}
 +
 +void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len,
 +                        int reserved)
 +{
 +      strbuf_grow(sb, len);
 +      while (len--) {
 +              char ch = *s++;
 +              if (is_rfc3986_unreserved(ch) ||
 +                  (!reserved && is_rfc3986_reserved(ch)))
 +                      strbuf_addch(sb, ch);
 +              else
 +                      strbuf_addf(sb, "%%%02x", ch);
 +      }
 +}
 +
 +void strbuf_addstr_urlencode(struct strbuf *sb, const char *s,
 +                           int reserved)
 +{
 +      strbuf_add_urlencode(sb, s, strlen(s), reserved);
 +}
diff --combined strbuf.h
index fbf059f4d371441b58fcad748e74e106a436241f,e42dbe5ac8e632d268916bfbfc2f830159f4a760..3effaa86b68f7b600dfd854558b7ee6f5d6f2f5e
+++ b/strbuf.h
@@@ -100,14 -100,6 +100,14 @@@ extern void strbuf_addf(struct strbuf *
  __attribute__((format (printf,2,0)))
  extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap);
  
 +extern void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, size_t size);
 +
 +static inline void strbuf_complete_line(struct strbuf *sb)
 +{
 +      if (sb->len && sb->buf[sb->len - 1] != '\n')
 +              strbuf_addch(sb, '\n');
 +}
 +
  extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
  /* XXX: if read fails, any partial read is undone */
  extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
@@@ -116,6 -108,7 +116,7 @@@ extern int strbuf_readlink(struct strbu
  
  extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
  extern int strbuf_getline(struct strbuf *, FILE *, int);
+ extern int strbuf_getwholeline_fd(struct strbuf *, int, int);
  
  extern void stripspace(struct strbuf *buf, int skip_comments);
  extern int launch_editor(const char *path, struct strbuf *buffer, const char *const *env);
  extern int strbuf_branchname(struct strbuf *sb, const char *name);
  extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
  
 +extern void strbuf_add_urlencode(struct strbuf *, const char *, size_t,
 +                               int reserved);
 +extern void strbuf_addstr_urlencode(struct strbuf *, const char *,
 +                                  int reserved);
 +
  #endif /* STRBUF_H */