/* Insert a chunk of blame associated with REV starting at token START and continuing for LENGTH tokens */ static svn_error_t * blame_insert_range(struct blame_chain *chain, struct rev *rev, apr_off_t start, apr_off_t length) { struct blame *head = chain->blame; struct blame *point = blame_find(head, start); struct blame *insert; if (point->start == start) { insert = blame_create(chain, point->rev, point->start + length); point->rev = rev; insert->next = point->next; point->next = insert; } else { struct blame *middle; middle = blame_create(chain, rev, start); insert = blame_create(chain, point->rev, start + length); middle->next = insert; insert->next = point->next; point->next = middle; } blame_adjust(insert->next, length); return SVN_NO_ERROR; }
/* Insert a chunk of blame associated with DB->REV starting at token START and continuing for LENGTH tokens */ static svn_error_t * blame_insert_range (struct file_rev_baton *db, apr_off_t start, apr_off_t length) { struct blame *head = db->blame; struct blame *point = blame_find (head, start); struct blame *insert; if (point->start == start) { insert = blame_create (db, point->rev, point->start + length); point->rev = db->rev; insert->next = point->next; point->next = insert; } else if (!point->next || point->next->start > start + length) { struct blame *middle; middle = blame_create (db, db->rev, start); insert = blame_create (db, point->rev, start + length); middle->next = insert; insert->next = point->next; point->next = middle; } else { insert = blame_create (db, db->rev, start); insert->next = point->next; point->next = insert; } blame_adjust (insert->next, length); return SVN_NO_ERROR; }
/* Delete the blame associated with the region from token START to START + LENGTH */ static svn_error_t * blame_delete_range(struct blame_chain *chain, apr_off_t start, apr_off_t length) { struct blame *first = blame_find(chain->blame, start); struct blame *last = blame_find(chain->blame, start + length); struct blame *tail = last->next; if (first != last) { struct blame *walk = first->next; while (walk != last) { struct blame *next = walk->next; blame_destroy(chain, walk); walk = next; } first->next = last; last->start = start; if (first->start == start) { *first = *last; blame_destroy(chain, last); last = first; } } if (tail && tail->start == last->start + length) { *last = *tail; blame_destroy(chain, tail); tail = last->next; } blame_adjust(tail, -length); return SVN_NO_ERROR; }