Rename path_list to string_list
The name path_list was correct for the first usage of that data structure, but it really is a general-purpose string list. $ perl -i -pe 's/path-list/string-list/g' $(git grep -l path-list) $ perl -i -pe 's/path_list/string_list/g' $(git grep -l path_list) $ git mv path-list.h string-list.h $ git mv path-list.c string-list.c $ perl -i -pe 's/has_path/has_string/g' $(git grep -l has_path) $ perl -i -pe 's/path/string/g' string-list.[ch] $ git mv Documentation/technical/api-path-list.txt \ Documentation/technical/api-string-list.txt $ perl -i -pe 's/strdup_paths/strdup_strings/g' $(git grep -l strdup_paths) ... and then fix all users of string-list to access the member "string" instead of "path". Documentation/technical/api-string-list.txt needed some rewrapping, too. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
51ef1daa4a
commit
c455c87c5c
@ -105,7 +105,7 @@ For C programs:
|
|||||||
|
|
||||||
- Use the API. No, really. We have a strbuf (variable length
|
- Use the API. No, really. We have a strbuf (variable length
|
||||||
string), several arrays with the ALLOC_GROW() macro, a
|
string), several arrays with the ALLOC_GROW() macro, a
|
||||||
path_list for sorted string lists, a hash map (mapping struct
|
string_list for sorted string lists, a hash map (mapping struct
|
||||||
objects) named "struct decorate", amongst other things.
|
objects) named "struct decorate", amongst other things.
|
||||||
|
|
||||||
- When you come up with an API, document it.
|
- When you come up with an API, document it.
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
path-list API
|
|
||||||
=============
|
|
||||||
|
|
||||||
The path_list API offers a data structure and functions to handle sorted
|
|
||||||
and unsorted string lists.
|
|
||||||
|
|
||||||
The name is a bit misleading, a path_list may store not only paths but
|
|
||||||
strings in general.
|
|
||||||
|
|
||||||
The caller:
|
|
||||||
|
|
||||||
. Allocates and clears a `struct path_list` variable.
|
|
||||||
|
|
||||||
. Initializes the members. You might want to set the flag `strdup_paths`
|
|
||||||
if the strings should be strdup()ed. For example, this is necessary
|
|
||||||
when you add something like git_path("..."), since that function returns
|
|
||||||
a static buffer that will change with the next call to git_path().
|
|
||||||
+
|
|
||||||
If you need something advanced, you can manually malloc() the `items`
|
|
||||||
member (you need this if you add things later) and you should set the
|
|
||||||
`nr` and `alloc` members in that case, too.
|
|
||||||
|
|
||||||
. Adds new items to the list, using `path_list_append` or `path_list_insert`.
|
|
||||||
|
|
||||||
. Can check if a string is in the list using `path_list_has_path` or
|
|
||||||
`unsorted_path_list_has_path` and get it from the list using
|
|
||||||
`path_list_lookup` for sorted lists.
|
|
||||||
|
|
||||||
. Can sort an unsorted list using `sort_path_list`.
|
|
||||||
|
|
||||||
. Finally it should free the list using `path_list_clear`.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
----
|
|
||||||
struct path_list list;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset(&list, 0, sizeof(struct path_list));
|
|
||||||
path_list_append("foo", &list);
|
|
||||||
path_list_append("bar", &list);
|
|
||||||
for (i = 0; i < list.nr; i++)
|
|
||||||
printf("%s\n", list.items[i].path)
|
|
||||||
----
|
|
||||||
|
|
||||||
NOTE: It is more efficient to build an unsorted list and sort it
|
|
||||||
afterwards, instead of building a sorted list (`O(n log n)` instead of
|
|
||||||
`O(n^2)`).
|
|
||||||
+
|
|
||||||
However, if you use the list to check if a certain string was added
|
|
||||||
already, you should not do that (using unsorted_path_list_has_path()),
|
|
||||||
because the complexity would be quadratic again (but with a worse factor).
|
|
||||||
|
|
||||||
Functions
|
|
||||||
---------
|
|
||||||
|
|
||||||
* General ones (works with sorted and unsorted lists as well)
|
|
||||||
|
|
||||||
`print_path_list`::
|
|
||||||
|
|
||||||
Dump a path_list to stdout, useful mainly for debugging purposes. It
|
|
||||||
can take an optional header argument and it writes out the
|
|
||||||
string-pointer pairs of the path_list, each one in its own line.
|
|
||||||
|
|
||||||
`path_list_clear`::
|
|
||||||
|
|
||||||
Free a path_list. The `path` pointer of the items will be freed in case
|
|
||||||
the `strdup_paths` member of the path_list is set. The second parameter
|
|
||||||
controls if the `util` pointer of the items should be freed or not.
|
|
||||||
|
|
||||||
* Functions for sorted lists only
|
|
||||||
|
|
||||||
`path_list_has_path`::
|
|
||||||
|
|
||||||
Determine if the path_list has a given string or not.
|
|
||||||
|
|
||||||
`path_list_insert`::
|
|
||||||
|
|
||||||
Insert a new element to the path_list. The returned pointer can be handy
|
|
||||||
if you want to write something to the `util` pointer of the
|
|
||||||
path_list_item containing the just added string.
|
|
||||||
+
|
|
||||||
Since this function uses xrealloc() (which die()s if it fails) if the
|
|
||||||
list needs to grow, it is safe not to check the pointer. I.e. you may
|
|
||||||
write `path_list_insert(...)->util = ...;`.
|
|
||||||
|
|
||||||
`path_list_lookup`::
|
|
||||||
|
|
||||||
Look up a given string in the path_list, returning the containing
|
|
||||||
path_list_item. If the string is not found, NULL is returned.
|
|
||||||
|
|
||||||
* Functions for unsorted lists only
|
|
||||||
|
|
||||||
`path_list_append`::
|
|
||||||
|
|
||||||
Append a new string to the end of the path_list.
|
|
||||||
|
|
||||||
`sort_path_list`::
|
|
||||||
|
|
||||||
Make an unsorted list sorted.
|
|
||||||
|
|
||||||
`unsorted_path_list_has_path`::
|
|
||||||
|
|
||||||
It's like `path_list_has_path()` but for unsorted lists.
|
|
||||||
+
|
|
||||||
This function needs to look through all items, as opposed to its
|
|
||||||
counterpart for sorted lists, which performs a binary search.
|
|
||||||
|
|
||||||
Data structures
|
|
||||||
---------------
|
|
||||||
|
|
||||||
* `struct path_list_item`
|
|
||||||
|
|
||||||
Represents an item of the list. The `path` member is a pointer to the
|
|
||||||
string, and you may use the `util` member for any purpose, if you want.
|
|
||||||
|
|
||||||
* `struct path_list`
|
|
||||||
|
|
||||||
Represents the list itself.
|
|
||||||
|
|
||||||
. The array of items are available via the `items` member.
|
|
||||||
. The `nr` member contains the number of items stored in the list.
|
|
||||||
. The `alloc` member is used to avoid reallocating at every insertion.
|
|
||||||
You should not tamper with it.
|
|
||||||
. Setting the `strdup_paths` member to 1 will strdup() the strings
|
|
||||||
before adding them, see above.
|
|
128
Documentation/technical/api-string-list.txt
Normal file
128
Documentation/technical/api-string-list.txt
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
string-list API
|
||||||
|
===============
|
||||||
|
|
||||||
|
The string_list API offers a data structure and functions to handle sorted
|
||||||
|
and unsorted string lists.
|
||||||
|
|
||||||
|
The 'string_list' struct used to be called 'path_list', but was renamed
|
||||||
|
because it is not specific to paths.
|
||||||
|
|
||||||
|
The caller:
|
||||||
|
|
||||||
|
. Allocates and clears a `struct string_list` variable.
|
||||||
|
|
||||||
|
. Initializes the members. You might want to set the flag `strdup_strings`
|
||||||
|
if the strings should be strdup()ed. For example, this is necessary
|
||||||
|
when you add something like git_path("..."), since that function returns
|
||||||
|
a static buffer that will change with the next call to git_path().
|
||||||
|
+
|
||||||
|
If you need something advanced, you can manually malloc() the `items`
|
||||||
|
member (you need this if you add things later) and you should set the
|
||||||
|
`nr` and `alloc` members in that case, too.
|
||||||
|
|
||||||
|
. Adds new items to the list, using `string_list_append` or
|
||||||
|
`string_list_insert`.
|
||||||
|
|
||||||
|
. Can check if a string is in the list using `string_list_has_string` or
|
||||||
|
`unsorted_string_list_has_string` and get it from the list using
|
||||||
|
`string_list_lookup` for sorted lists.
|
||||||
|
|
||||||
|
. Can sort an unsorted list using `sort_string_list`.
|
||||||
|
|
||||||
|
. Finally it should free the list using `string_list_clear`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
----
|
||||||
|
struct string_list list;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(&list, 0, sizeof(struct string_list));
|
||||||
|
string_list_append("foo", &list);
|
||||||
|
string_list_append("bar", &list);
|
||||||
|
for (i = 0; i < list.nr; i++)
|
||||||
|
printf("%s\n", list.items[i].path)
|
||||||
|
----
|
||||||
|
|
||||||
|
NOTE: It is more efficient to build an unsorted list and sort it
|
||||||
|
afterwards, instead of building a sorted list (`O(n log n)` instead of
|
||||||
|
`O(n^2)`).
|
||||||
|
+
|
||||||
|
However, if you use the list to check if a certain string was added
|
||||||
|
already, you should not do that (using unsorted_string_list_has_string()),
|
||||||
|
because the complexity would be quadratic again (but with a worse factor).
|
||||||
|
|
||||||
|
Functions
|
||||||
|
---------
|
||||||
|
|
||||||
|
* General ones (works with sorted and unsorted lists as well)
|
||||||
|
|
||||||
|
`print_string_list`::
|
||||||
|
|
||||||
|
Dump a string_list to stdout, useful mainly for debugging purposes. It
|
||||||
|
can take an optional header argument and it writes out the
|
||||||
|
string-pointer pairs of the string_list, each one in its own line.
|
||||||
|
|
||||||
|
`string_list_clear`::
|
||||||
|
|
||||||
|
Free a string_list. The `string` pointer of the items will be freed in
|
||||||
|
case the `strdup_strings` member of the string_list is set. The second
|
||||||
|
parameter controls if the `util` pointer of the items should be freed
|
||||||
|
or not.
|
||||||
|
|
||||||
|
* Functions for sorted lists only
|
||||||
|
|
||||||
|
`string_list_has_string`::
|
||||||
|
|
||||||
|
Determine if the string_list has a given string or not.
|
||||||
|
|
||||||
|
`string_list_insert`::
|
||||||
|
|
||||||
|
Insert a new element to the string_list. The returned pointer can be
|
||||||
|
handy if you want to write something to the `util` pointer of the
|
||||||
|
string_list_item containing the just added string.
|
||||||
|
+
|
||||||
|
Since this function uses xrealloc() (which die()s if it fails) if the
|
||||||
|
list needs to grow, it is safe not to check the pointer. I.e. you may
|
||||||
|
write `string_list_insert(...)->util = ...;`.
|
||||||
|
|
||||||
|
`string_list_lookup`::
|
||||||
|
|
||||||
|
Look up a given string in the string_list, returning the containing
|
||||||
|
string_list_item. If the string is not found, NULL is returned.
|
||||||
|
|
||||||
|
* Functions for unsorted lists only
|
||||||
|
|
||||||
|
`string_list_append`::
|
||||||
|
|
||||||
|
Append a new string to the end of the string_list.
|
||||||
|
|
||||||
|
`sort_string_list`::
|
||||||
|
|
||||||
|
Make an unsorted list sorted.
|
||||||
|
|
||||||
|
`unsorted_string_list_has_string`::
|
||||||
|
|
||||||
|
It's like `string_list_has_string()` but for unsorted lists.
|
||||||
|
+
|
||||||
|
This function needs to look through all items, as opposed to its
|
||||||
|
counterpart for sorted lists, which performs a binary search.
|
||||||
|
|
||||||
|
Data structures
|
||||||
|
---------------
|
||||||
|
|
||||||
|
* `struct string_list_item`
|
||||||
|
|
||||||
|
Represents an item of the list. The `path` member is a pointer to the
|
||||||
|
string, and you may use the `util` member for any purpose, if you want.
|
||||||
|
|
||||||
|
* `struct string_list`
|
||||||
|
|
||||||
|
Represents the list itself.
|
||||||
|
|
||||||
|
. The array of items are available via the `items` member.
|
||||||
|
. The `nr` member contains the number of items stored in the list.
|
||||||
|
. The `alloc` member is used to avoid reallocating at every insertion.
|
||||||
|
You should not tamper with it.
|
||||||
|
. Setting the `strdup_strings` member to 1 will strdup() the strings
|
||||||
|
before adding them, see above.
|
4
Makefile
4
Makefile
@ -356,7 +356,7 @@ LIB_H += pack-refs.h
|
|||||||
LIB_H += pack-revindex.h
|
LIB_H += pack-revindex.h
|
||||||
LIB_H += parse-options.h
|
LIB_H += parse-options.h
|
||||||
LIB_H += patch-ids.h
|
LIB_H += patch-ids.h
|
||||||
LIB_H += path-list.h
|
LIB_H += string-list.h
|
||||||
LIB_H += pkt-line.h
|
LIB_H += pkt-line.h
|
||||||
LIB_H += progress.h
|
LIB_H += progress.h
|
||||||
LIB_H += quote.h
|
LIB_H += quote.h
|
||||||
@ -437,7 +437,7 @@ LIB_OBJS += pager.o
|
|||||||
LIB_OBJS += parse-options.o
|
LIB_OBJS += parse-options.o
|
||||||
LIB_OBJS += patch-delta.o
|
LIB_OBJS += patch-delta.o
|
||||||
LIB_OBJS += patch-ids.o
|
LIB_OBJS += patch-ids.o
|
||||||
LIB_OBJS += path-list.o
|
LIB_OBJS += string-list.o
|
||||||
LIB_OBJS += path.o
|
LIB_OBJS += path.o
|
||||||
LIB_OBJS += pkt-line.o
|
LIB_OBJS += pkt-line.o
|
||||||
LIB_OBJS += pretty.o
|
LIB_OBJS += pretty.o
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "blob.h"
|
#include "blob.h"
|
||||||
#include "delta.h"
|
#include "delta.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* --check turns on checking that the working tree matches the
|
* --check turns on checking that the working tree matches the
|
||||||
@ -194,7 +194,7 @@ struct image {
|
|||||||
* the case where more than one patches touch the same file.
|
* the case where more than one patches touch the same file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct path_list fn_table;
|
static struct string_list fn_table;
|
||||||
|
|
||||||
static uint32_t hash_line(const char *cp, size_t len)
|
static uint32_t hash_line(const char *cp, size_t len)
|
||||||
{
|
{
|
||||||
@ -2250,12 +2250,12 @@ static int read_file_or_gitlink(struct cache_entry *ce, struct strbuf *buf)
|
|||||||
|
|
||||||
static struct patch *in_fn_table(const char *name)
|
static struct patch *in_fn_table(const char *name)
|
||||||
{
|
{
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
item = path_list_lookup(name, &fn_table);
|
item = string_list_lookup(name, &fn_table);
|
||||||
if (item != NULL)
|
if (item != NULL)
|
||||||
return (struct patch *)item->util;
|
return (struct patch *)item->util;
|
||||||
|
|
||||||
@ -2264,7 +2264,7 @@ static struct patch *in_fn_table(const char *name)
|
|||||||
|
|
||||||
static void add_to_fn_table(struct patch *patch)
|
static void add_to_fn_table(struct patch *patch)
|
||||||
{
|
{
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Always add new_name unless patch is a deletion
|
* Always add new_name unless patch is a deletion
|
||||||
@ -2272,7 +2272,7 @@ static void add_to_fn_table(struct patch *patch)
|
|||||||
* file creations and copies
|
* file creations and copies
|
||||||
*/
|
*/
|
||||||
if (patch->new_name != NULL) {
|
if (patch->new_name != NULL) {
|
||||||
item = path_list_insert(patch->new_name, &fn_table);
|
item = string_list_insert(patch->new_name, &fn_table);
|
||||||
item->util = patch;
|
item->util = patch;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2281,7 +2281,7 @@ static void add_to_fn_table(struct patch *patch)
|
|||||||
* later chunks shouldn't patch old names
|
* later chunks shouldn't patch old names
|
||||||
*/
|
*/
|
||||||
if ((patch->new_name == NULL) || (patch->is_rename)) {
|
if ((patch->new_name == NULL) || (patch->is_rename)) {
|
||||||
item = path_list_insert(patch->old_name, &fn_table);
|
item = string_list_insert(patch->old_name, &fn_table);
|
||||||
item->util = (struct patch *) -1;
|
item->util = (struct patch *) -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3051,7 +3051,7 @@ static int apply_patch(int fd, const char *filename, int options)
|
|||||||
int skipped_patch = 0;
|
int skipped_patch = 0;
|
||||||
|
|
||||||
/* FIXME - memory leak when using multiple patch files as inputs */
|
/* FIXME - memory leak when using multiple patch files as inputs */
|
||||||
memset(&fn_table, 0, sizeof(struct path_list));
|
memset(&fn_table, 0, sizeof(struct string_list));
|
||||||
strbuf_init(&buf, 0);
|
strbuf_init(&buf, 0);
|
||||||
patch_input_file = filename;
|
patch_input_file = filename;
|
||||||
read_patch_file(&buf, fd);
|
read_patch_file(&buf, fd);
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
#include "xdiff-interface.h"
|
#include "xdiff-interface.h"
|
||||||
#include "cache-tree.h"
|
#include "cache-tree.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "mailmap.h"
|
#include "mailmap.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ static int blank_boundary;
|
|||||||
static int incremental;
|
static int incremental;
|
||||||
static int cmd_is_annotate;
|
static int cmd_is_annotate;
|
||||||
static int xdl_opts = XDF_NEED_MINIMAL;
|
static int xdl_opts = XDF_NEED_MINIMAL;
|
||||||
static struct path_list mailmap;
|
static struct string_list mailmap;
|
||||||
|
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
@ -1926,7 +1926,7 @@ static void sanity_check_refcnt(struct scoreboard *sb)
|
|||||||
* Used for the command line parsing; check if the path exists
|
* Used for the command line parsing; check if the path exists
|
||||||
* in the working tree.
|
* in the working tree.
|
||||||
*/
|
*/
|
||||||
static int has_path_in_work_tree(const char *path)
|
static int has_string_in_work_tree(const char *path)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
return !lstat(path, &st);
|
return !lstat(path, &st);
|
||||||
@ -2390,14 +2390,14 @@ parse_done:
|
|||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
usage_with_options(blame_opt_usage, options);
|
usage_with_options(blame_opt_usage, options);
|
||||||
path = add_prefix(prefix, argv[argc - 1]);
|
path = add_prefix(prefix, argv[argc - 1]);
|
||||||
if (argc == 3 && !has_path_in_work_tree(path)) { /* (2b) */
|
if (argc == 3 && !has_string_in_work_tree(path)) { /* (2b) */
|
||||||
path = add_prefix(prefix, argv[1]);
|
path = add_prefix(prefix, argv[1]);
|
||||||
argv[1] = argv[2];
|
argv[1] = argv[2];
|
||||||
}
|
}
|
||||||
argv[argc - 1] = "--";
|
argv[argc - 1] = "--";
|
||||||
|
|
||||||
setup_work_tree();
|
setup_work_tree();
|
||||||
if (!has_path_in_work_tree(path))
|
if (!has_string_in_work_tree(path))
|
||||||
die("cannot stat path %s: %s", path, strerror(errno));
|
die("cannot stat path %s: %s", path, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "rerere.h"
|
#include "rerere.h"
|
||||||
#include "unpack-trees.h"
|
#include "unpack-trees.h"
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ static int commit_index_files(void)
|
|||||||
* Take a union of paths in the index and the named tree (typically, "HEAD"),
|
* Take a union of paths in the index and the named tree (typically, "HEAD"),
|
||||||
* and return the paths that match the given pattern in list.
|
* and return the paths that match the given pattern in list.
|
||||||
*/
|
*/
|
||||||
static int list_paths(struct path_list *list, const char *with_tree,
|
static int list_paths(struct string_list *list, const char *with_tree,
|
||||||
const char *prefix, const char **pattern)
|
const char *prefix, const char **pattern)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -169,24 +169,24 @@ static int list_paths(struct path_list *list, const char *with_tree,
|
|||||||
continue;
|
continue;
|
||||||
if (!pathspec_match(pattern, m, ce->name, 0))
|
if (!pathspec_match(pattern, m, ce->name, 0))
|
||||||
continue;
|
continue;
|
||||||
path_list_insert(ce->name, list);
|
string_list_insert(ce->name, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
return report_path_error(m, pattern, prefix ? strlen(prefix) : 0);
|
return report_path_error(m, pattern, prefix ? strlen(prefix) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_remove_files(struct path_list *list)
|
static void add_remove_files(struct string_list *list)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < list->nr; i++) {
|
for (i = 0; i < list->nr; i++) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct path_list_item *p = &(list->items[i]);
|
struct string_list_item *p = &(list->items[i]);
|
||||||
|
|
||||||
if (!lstat(p->path, &st)) {
|
if (!lstat(p->string, &st)) {
|
||||||
if (add_to_cache(p->path, &st, 0))
|
if (add_to_cache(p->string, &st, 0))
|
||||||
die("updating files failed");
|
die("updating files failed");
|
||||||
} else
|
} else
|
||||||
remove_file_from_cache(p->path);
|
remove_file_from_cache(p->string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ static void create_base_index(void)
|
|||||||
static char *prepare_index(int argc, const char **argv, const char *prefix)
|
static char *prepare_index(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
struct path_list partial;
|
struct string_list partial;
|
||||||
const char **pathspec = NULL;
|
const char **pathspec = NULL;
|
||||||
|
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
@ -305,7 +305,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
|
|||||||
die("cannot do a partial commit during a merge.");
|
die("cannot do a partial commit during a merge.");
|
||||||
|
|
||||||
memset(&partial, 0, sizeof(partial));
|
memset(&partial, 0, sizeof(partial));
|
||||||
partial.strdup_paths = 1;
|
partial.strdup_strings = 1;
|
||||||
if (list_paths(&partial, initial_commit ? NULL : "HEAD", prefix, pathspec))
|
if (list_paths(&partial, initial_commit ? NULL : "HEAD", prefix, pathspec))
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "log-tree.h"
|
#include "log-tree.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "decorate.h"
|
#include "decorate.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void get_tags_and_duplicates(struct object_array *pending,
|
static void get_tags_and_duplicates(struct object_array *pending,
|
||||||
struct path_list *extra_refs)
|
struct string_list *extra_refs)
|
||||||
{
|
{
|
||||||
struct tag *tag;
|
struct tag *tag;
|
||||||
int i;
|
int i;
|
||||||
@ -330,7 +330,7 @@ static void get_tags_and_duplicates(struct object_array *pending,
|
|||||||
case OBJ_TAG:
|
case OBJ_TAG:
|
||||||
tag = (struct tag *)e->item;
|
tag = (struct tag *)e->item;
|
||||||
while (tag && tag->object.type == OBJ_TAG) {
|
while (tag && tag->object.type == OBJ_TAG) {
|
||||||
path_list_insert(full_name, extra_refs)->util = tag;
|
string_list_insert(full_name, extra_refs)->util = tag;
|
||||||
tag = (struct tag *)tag->tagged;
|
tag = (struct tag *)tag->tagged;
|
||||||
}
|
}
|
||||||
if (!tag)
|
if (!tag)
|
||||||
@ -350,19 +350,19 @@ static void get_tags_and_duplicates(struct object_array *pending,
|
|||||||
}
|
}
|
||||||
if (commit->util)
|
if (commit->util)
|
||||||
/* more than one name for the same object */
|
/* more than one name for the same object */
|
||||||
path_list_insert(full_name, extra_refs)->util = commit;
|
string_list_insert(full_name, extra_refs)->util = commit;
|
||||||
else
|
else
|
||||||
commit->util = full_name;
|
commit->util = full_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_tags_and_duplicates(struct path_list *extra_refs)
|
static void handle_tags_and_duplicates(struct string_list *extra_refs)
|
||||||
{
|
{
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = extra_refs->nr - 1; i >= 0; i--) {
|
for (i = extra_refs->nr - 1; i >= 0; i--) {
|
||||||
const char *name = extra_refs->items[i].path;
|
const char *name = extra_refs->items[i].string;
|
||||||
struct object *object = extra_refs->items[i].util;
|
struct object *object = extra_refs->items[i].util;
|
||||||
switch (object->type) {
|
switch (object->type) {
|
||||||
case OBJ_TAG:
|
case OBJ_TAG:
|
||||||
@ -445,7 +445,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
{
|
{
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
struct object_array commits = { 0, 0, NULL };
|
struct object_array commits = { 0, 0, NULL };
|
||||||
struct path_list extra_refs = { NULL, 0, 0, 0 };
|
struct string_list extra_refs = { NULL, 0, 0, 0 };
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
char *export_filename = NULL, *import_filename = NULL;
|
char *export_filename = NULL, *import_filename = NULL;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "commit.h"
|
#include "commit.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
@ -465,8 +465,8 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map)
|
|||||||
static int add_existing(const char *refname, const unsigned char *sha1,
|
static int add_existing(const char *refname, const unsigned char *sha1,
|
||||||
int flag, void *cbdata)
|
int flag, void *cbdata)
|
||||||
{
|
{
|
||||||
struct path_list *list = (struct path_list *)cbdata;
|
struct string_list *list = (struct string_list *)cbdata;
|
||||||
path_list_insert(refname, list);
|
string_list_insert(refname, list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,8 +485,8 @@ static void find_non_local_tags(struct transport *transport,
|
|||||||
struct ref **head,
|
struct ref **head,
|
||||||
struct ref ***tail)
|
struct ref ***tail)
|
||||||
{
|
{
|
||||||
struct path_list existing_refs = { NULL, 0, 0, 0 };
|
struct string_list existing_refs = { NULL, 0, 0, 0 };
|
||||||
struct path_list new_refs = { NULL, 0, 0, 1 };
|
struct string_list new_refs = { NULL, 0, 0, 1 };
|
||||||
char *ref_name;
|
char *ref_name;
|
||||||
int ref_name_len;
|
int ref_name_len;
|
||||||
const unsigned char *ref_sha1;
|
const unsigned char *ref_sha1;
|
||||||
@ -515,11 +515,11 @@ static void find_non_local_tags(struct transport *transport,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!path_list_has_path(&existing_refs, ref_name) &&
|
if (!string_list_has_string(&existing_refs, ref_name) &&
|
||||||
!path_list_has_path(&new_refs, ref_name) &&
|
!string_list_has_string(&new_refs, ref_name) &&
|
||||||
(has_sha1_file(ref->old_sha1) ||
|
(has_sha1_file(ref->old_sha1) ||
|
||||||
will_fetch(head, ref->old_sha1))) {
|
will_fetch(head, ref->old_sha1))) {
|
||||||
path_list_insert(ref_name, &new_refs);
|
string_list_insert(ref_name, &new_refs);
|
||||||
|
|
||||||
rm = alloc_ref_from_str(ref_name);
|
rm = alloc_ref_from_str(ref_name);
|
||||||
rm->peer_ref = alloc_ref_from_str(ref_name);
|
rm->peer_ref = alloc_ref_from_str(ref_name);
|
||||||
@ -530,8 +530,8 @@ static void find_non_local_tags(struct transport *transport,
|
|||||||
}
|
}
|
||||||
free(ref_name);
|
free(ref_name);
|
||||||
}
|
}
|
||||||
path_list_clear(&existing_refs, 0);
|
string_list_clear(&existing_refs, 0);
|
||||||
path_list_clear(&new_refs, 0);
|
string_list_clear(&new_refs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_fetch(struct transport *transport,
|
static int do_fetch(struct transport *transport,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
static const char git_mailsplit_usage[] =
|
static const char git_mailsplit_usage[] =
|
||||||
"git mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> [<mbox>|<Maildir>...]";
|
"git mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> [<mbox>|<Maildir>...]";
|
||||||
@ -115,7 +115,7 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int populate_maildir_list(struct path_list *list, const char *path)
|
static int populate_maildir_list(struct string_list *list, const char *path)
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
@ -136,7 +136,7 @@ static int populate_maildir_list(struct path_list *list, const char *path)
|
|||||||
if (dent->d_name[0] == '.')
|
if (dent->d_name[0] == '.')
|
||||||
continue;
|
continue;
|
||||||
snprintf(name, sizeof(name), "%s/%s", *sub, dent->d_name);
|
snprintf(name, sizeof(name), "%s/%s", *sub, dent->d_name);
|
||||||
path_list_insert(name, list);
|
string_list_insert(name, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
@ -152,14 +152,14 @@ static int split_maildir(const char *maildir, const char *dir,
|
|||||||
char name[PATH_MAX];
|
char name[PATH_MAX];
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int i;
|
int i;
|
||||||
struct path_list list = {NULL, 0, 0, 1};
|
struct string_list list = {NULL, 0, 0, 1};
|
||||||
|
|
||||||
if (populate_maildir_list(&list, maildir) < 0)
|
if (populate_maildir_list(&list, maildir) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
for (i = 0; i < list.nr; i++) {
|
for (i = 0; i < list.nr; i++) {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
snprintf(file, sizeof(file), "%s/%s", maildir, list.items[i].path);
|
snprintf(file, sizeof(file), "%s/%s", maildir, list.items[i].string);
|
||||||
f = fopen(file, "r");
|
f = fopen(file, "r");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
error("cannot open mail %s (%s)", file, strerror(errno));
|
error("cannot open mail %s (%s)", file, strerror(errno));
|
||||||
@ -179,7 +179,7 @@ static int split_maildir(const char *maildir, const char *dir,
|
|||||||
|
|
||||||
ret = skip;
|
ret = skip;
|
||||||
out:
|
out:
|
||||||
path_list_clear(&list, 1);
|
string_list_clear(&list, 1);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "diffcore.h"
|
#include "diffcore.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "unpack-trees.h"
|
#include "unpack-trees.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "xdiff-interface.h"
|
#include "xdiff-interface.h"
|
||||||
#include "ll-merge.h"
|
#include "ll-merge.h"
|
||||||
#include "interpolate.h"
|
#include "interpolate.h"
|
||||||
@ -79,8 +79,8 @@ struct stage_data
|
|||||||
unsigned processed:1;
|
unsigned processed:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct path_list current_file_set = {NULL, 0, 0, 1};
|
static struct string_list current_file_set = {NULL, 0, 0, 1};
|
||||||
static struct path_list current_directory_set = {NULL, 0, 0, 1};
|
static struct string_list current_directory_set = {NULL, 0, 0, 1};
|
||||||
|
|
||||||
static int call_depth = 0;
|
static int call_depth = 0;
|
||||||
static int verbosity = 2;
|
static int verbosity = 2;
|
||||||
@ -257,9 +257,9 @@ static int save_files_dirs(const unsigned char *sha1,
|
|||||||
newpath[baselen + len] = '\0';
|
newpath[baselen + len] = '\0';
|
||||||
|
|
||||||
if (S_ISDIR(mode))
|
if (S_ISDIR(mode))
|
||||||
path_list_insert(newpath, ¤t_directory_set);
|
string_list_insert(newpath, ¤t_directory_set);
|
||||||
else
|
else
|
||||||
path_list_insert(newpath, ¤t_file_set);
|
string_list_insert(newpath, ¤t_file_set);
|
||||||
free(newpath);
|
free(newpath);
|
||||||
|
|
||||||
return READ_TREE_RECURSIVE;
|
return READ_TREE_RECURSIVE;
|
||||||
@ -280,9 +280,9 @@ static int get_files_dirs(struct tree *tree)
|
|||||||
*/
|
*/
|
||||||
static struct stage_data *insert_stage_data(const char *path,
|
static struct stage_data *insert_stage_data(const char *path,
|
||||||
struct tree *o, struct tree *a, struct tree *b,
|
struct tree *o, struct tree *a, struct tree *b,
|
||||||
struct path_list *entries)
|
struct string_list *entries)
|
||||||
{
|
{
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
|
struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
|
||||||
get_tree_entry(o->object.sha1, path,
|
get_tree_entry(o->object.sha1, path,
|
||||||
e->stages[1].sha, &e->stages[1].mode);
|
e->stages[1].sha, &e->stages[1].mode);
|
||||||
@ -290,7 +290,7 @@ static struct stage_data *insert_stage_data(const char *path,
|
|||||||
e->stages[2].sha, &e->stages[2].mode);
|
e->stages[2].sha, &e->stages[2].mode);
|
||||||
get_tree_entry(b->object.sha1, path,
|
get_tree_entry(b->object.sha1, path,
|
||||||
e->stages[3].sha, &e->stages[3].mode);
|
e->stages[3].sha, &e->stages[3].mode);
|
||||||
item = path_list_insert(path, entries);
|
item = string_list_insert(path, entries);
|
||||||
item->util = e;
|
item->util = e;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@ -299,23 +299,23 @@ static struct stage_data *insert_stage_data(const char *path,
|
|||||||
* Create a dictionary mapping file names to stage_data objects. The
|
* Create a dictionary mapping file names to stage_data objects. The
|
||||||
* dictionary contains one entry for every path with a non-zero stage entry.
|
* dictionary contains one entry for every path with a non-zero stage entry.
|
||||||
*/
|
*/
|
||||||
static struct path_list *get_unmerged(void)
|
static struct string_list *get_unmerged(void)
|
||||||
{
|
{
|
||||||
struct path_list *unmerged = xcalloc(1, sizeof(struct path_list));
|
struct string_list *unmerged = xcalloc(1, sizeof(struct string_list));
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
unmerged->strdup_paths = 1;
|
unmerged->strdup_strings = 1;
|
||||||
|
|
||||||
for (i = 0; i < active_nr; i++) {
|
for (i = 0; i < active_nr; i++) {
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct stage_data *e;
|
struct stage_data *e;
|
||||||
struct cache_entry *ce = active_cache[i];
|
struct cache_entry *ce = active_cache[i];
|
||||||
if (!ce_stage(ce))
|
if (!ce_stage(ce))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
item = path_list_lookup(ce->name, unmerged);
|
item = string_list_lookup(ce->name, unmerged);
|
||||||
if (!item) {
|
if (!item) {
|
||||||
item = path_list_insert(ce->name, unmerged);
|
item = string_list_insert(ce->name, unmerged);
|
||||||
item->util = xcalloc(1, sizeof(struct stage_data));
|
item->util = xcalloc(1, sizeof(struct stage_data));
|
||||||
}
|
}
|
||||||
e = item->util;
|
e = item->util;
|
||||||
@ -340,17 +340,17 @@ struct rename
|
|||||||
* 'b_tree') to be able to associate the correct cache entries with
|
* 'b_tree') to be able to associate the correct cache entries with
|
||||||
* the rename information. 'tree' is always equal to either a_tree or b_tree.
|
* the rename information. 'tree' is always equal to either a_tree or b_tree.
|
||||||
*/
|
*/
|
||||||
static struct path_list *get_renames(struct tree *tree,
|
static struct string_list *get_renames(struct tree *tree,
|
||||||
struct tree *o_tree,
|
struct tree *o_tree,
|
||||||
struct tree *a_tree,
|
struct tree *a_tree,
|
||||||
struct tree *b_tree,
|
struct tree *b_tree,
|
||||||
struct path_list *entries)
|
struct string_list *entries)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct path_list *renames;
|
struct string_list *renames;
|
||||||
struct diff_options opts;
|
struct diff_options opts;
|
||||||
|
|
||||||
renames = xcalloc(1, sizeof(struct path_list));
|
renames = xcalloc(1, sizeof(struct string_list));
|
||||||
diff_setup(&opts);
|
diff_setup(&opts);
|
||||||
DIFF_OPT_SET(&opts, RECURSIVE);
|
DIFF_OPT_SET(&opts, RECURSIVE);
|
||||||
opts.detect_rename = DIFF_DETECT_RENAME;
|
opts.detect_rename = DIFF_DETECT_RENAME;
|
||||||
@ -364,7 +364,7 @@ static struct path_list *get_renames(struct tree *tree,
|
|||||||
diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
|
diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
|
||||||
diffcore_std(&opts);
|
diffcore_std(&opts);
|
||||||
for (i = 0; i < diff_queued_diff.nr; ++i) {
|
for (i = 0; i < diff_queued_diff.nr; ++i) {
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct rename *re;
|
struct rename *re;
|
||||||
struct diff_filepair *pair = diff_queued_diff.queue[i];
|
struct diff_filepair *pair = diff_queued_diff.queue[i];
|
||||||
if (pair->status != 'R') {
|
if (pair->status != 'R') {
|
||||||
@ -374,20 +374,20 @@ static struct path_list *get_renames(struct tree *tree,
|
|||||||
re = xmalloc(sizeof(*re));
|
re = xmalloc(sizeof(*re));
|
||||||
re->processed = 0;
|
re->processed = 0;
|
||||||
re->pair = pair;
|
re->pair = pair;
|
||||||
item = path_list_lookup(re->pair->one->path, entries);
|
item = string_list_lookup(re->pair->one->path, entries);
|
||||||
if (!item)
|
if (!item)
|
||||||
re->src_entry = insert_stage_data(re->pair->one->path,
|
re->src_entry = insert_stage_data(re->pair->one->path,
|
||||||
o_tree, a_tree, b_tree, entries);
|
o_tree, a_tree, b_tree, entries);
|
||||||
else
|
else
|
||||||
re->src_entry = item->util;
|
re->src_entry = item->util;
|
||||||
|
|
||||||
item = path_list_lookup(re->pair->two->path, entries);
|
item = string_list_lookup(re->pair->two->path, entries);
|
||||||
if (!item)
|
if (!item)
|
||||||
re->dst_entry = insert_stage_data(re->pair->two->path,
|
re->dst_entry = insert_stage_data(re->pair->two->path,
|
||||||
o_tree, a_tree, b_tree, entries);
|
o_tree, a_tree, b_tree, entries);
|
||||||
else
|
else
|
||||||
re->dst_entry = item->util;
|
re->dst_entry = item->util;
|
||||||
item = path_list_insert(pair->one->path, renames);
|
item = string_list_insert(pair->one->path, renames);
|
||||||
item->util = re;
|
item->util = re;
|
||||||
}
|
}
|
||||||
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
|
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
|
||||||
@ -464,12 +464,12 @@ static char *unique_path(const char *path, const char *branch)
|
|||||||
for (; *p; ++p)
|
for (; *p; ++p)
|
||||||
if ('/' == *p)
|
if ('/' == *p)
|
||||||
*p = '_';
|
*p = '_';
|
||||||
while (path_list_has_path(¤t_file_set, newpath) ||
|
while (string_list_has_string(¤t_file_set, newpath) ||
|
||||||
path_list_has_path(¤t_directory_set, newpath) ||
|
string_list_has_string(¤t_directory_set, newpath) ||
|
||||||
lstat(newpath, &st) == 0)
|
lstat(newpath, &st) == 0)
|
||||||
sprintf(p, "_%d", suffix++);
|
sprintf(p, "_%d", suffix++);
|
||||||
|
|
||||||
path_list_insert(newpath, ¤t_file_set);
|
string_list_insert(newpath, ¤t_file_set);
|
||||||
return newpath;
|
return newpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -727,13 +727,13 @@ static void conflict_rename_rename(struct rename *ren1,
|
|||||||
const char *ren2_dst = ren2->pair->two->path;
|
const char *ren2_dst = ren2->pair->two->path;
|
||||||
const char *dst_name1 = ren1_dst;
|
const char *dst_name1 = ren1_dst;
|
||||||
const char *dst_name2 = ren2_dst;
|
const char *dst_name2 = ren2_dst;
|
||||||
if (path_list_has_path(¤t_directory_set, ren1_dst)) {
|
if (string_list_has_string(¤t_directory_set, ren1_dst)) {
|
||||||
dst_name1 = del[delp++] = unique_path(ren1_dst, branch1);
|
dst_name1 = del[delp++] = unique_path(ren1_dst, branch1);
|
||||||
output(1, "%s is a directory in %s added as %s instead",
|
output(1, "%s is a directory in %s added as %s instead",
|
||||||
ren1_dst, branch2, dst_name1);
|
ren1_dst, branch2, dst_name1);
|
||||||
remove_file(0, ren1_dst, 0);
|
remove_file(0, ren1_dst, 0);
|
||||||
}
|
}
|
||||||
if (path_list_has_path(¤t_directory_set, ren2_dst)) {
|
if (string_list_has_string(¤t_directory_set, ren2_dst)) {
|
||||||
dst_name2 = del[delp++] = unique_path(ren2_dst, branch2);
|
dst_name2 = del[delp++] = unique_path(ren2_dst, branch2);
|
||||||
output(1, "%s is a directory in %s added as %s instead",
|
output(1, "%s is a directory in %s added as %s instead",
|
||||||
ren2_dst, branch1, dst_name2);
|
ren2_dst, branch1, dst_name2);
|
||||||
@ -783,30 +783,30 @@ static void conflict_rename_rename_2(struct rename *ren1,
|
|||||||
free(new_path1);
|
free(new_path1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int process_renames(struct path_list *a_renames,
|
static int process_renames(struct string_list *a_renames,
|
||||||
struct path_list *b_renames,
|
struct string_list *b_renames,
|
||||||
const char *a_branch,
|
const char *a_branch,
|
||||||
const char *b_branch)
|
const char *b_branch)
|
||||||
{
|
{
|
||||||
int clean_merge = 1, i, j;
|
int clean_merge = 1, i, j;
|
||||||
struct path_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};
|
struct string_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};
|
||||||
const struct rename *sre;
|
const struct rename *sre;
|
||||||
|
|
||||||
for (i = 0; i < a_renames->nr; i++) {
|
for (i = 0; i < a_renames->nr; i++) {
|
||||||
sre = a_renames->items[i].util;
|
sre = a_renames->items[i].util;
|
||||||
path_list_insert(sre->pair->two->path, &a_by_dst)->util
|
string_list_insert(sre->pair->two->path, &a_by_dst)->util
|
||||||
= sre->dst_entry;
|
= sre->dst_entry;
|
||||||
}
|
}
|
||||||
for (i = 0; i < b_renames->nr; i++) {
|
for (i = 0; i < b_renames->nr; i++) {
|
||||||
sre = b_renames->items[i].util;
|
sre = b_renames->items[i].util;
|
||||||
path_list_insert(sre->pair->two->path, &b_by_dst)->util
|
string_list_insert(sre->pair->two->path, &b_by_dst)->util
|
||||||
= sre->dst_entry;
|
= sre->dst_entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) {
|
for (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) {
|
||||||
int compare;
|
int compare;
|
||||||
char *src;
|
char *src;
|
||||||
struct path_list *renames1, *renames2, *renames2Dst;
|
struct string_list *renames1, *renames2, *renames2Dst;
|
||||||
struct rename *ren1 = NULL, *ren2 = NULL;
|
struct rename *ren1 = NULL, *ren2 = NULL;
|
||||||
const char *branch1, *branch2;
|
const char *branch1, *branch2;
|
||||||
const char *ren1_src, *ren1_dst;
|
const char *ren1_src, *ren1_dst;
|
||||||
@ -818,8 +818,8 @@ static int process_renames(struct path_list *a_renames,
|
|||||||
compare = -1;
|
compare = -1;
|
||||||
ren1 = a_renames->items[i++].util;
|
ren1 = a_renames->items[i++].util;
|
||||||
} else {
|
} else {
|
||||||
compare = strcmp(a_renames->items[i].path,
|
compare = strcmp(a_renames->items[i].string,
|
||||||
b_renames->items[j].path);
|
b_renames->items[j].string);
|
||||||
if (compare <= 0)
|
if (compare <= 0)
|
||||||
ren1 = a_renames->items[i++].util;
|
ren1 = a_renames->items[i++].util;
|
||||||
if (compare >= 0)
|
if (compare >= 0)
|
||||||
@ -908,7 +908,7 @@ static int process_renames(struct path_list *a_renames,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Renamed in 1, maybe changed in 2 */
|
/* Renamed in 1, maybe changed in 2 */
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
/* we only use sha1 and mode of these */
|
/* we only use sha1 and mode of these */
|
||||||
struct diff_filespec src_other, dst_other;
|
struct diff_filespec src_other, dst_other;
|
||||||
int try_merge, stage = a_renames == renames1 ? 3: 2;
|
int try_merge, stage = a_renames == renames1 ? 3: 2;
|
||||||
@ -922,7 +922,7 @@ static int process_renames(struct path_list *a_renames,
|
|||||||
|
|
||||||
try_merge = 0;
|
try_merge = 0;
|
||||||
|
|
||||||
if (path_list_has_path(¤t_directory_set, ren1_dst)) {
|
if (string_list_has_string(¤t_directory_set, ren1_dst)) {
|
||||||
clean_merge = 0;
|
clean_merge = 0;
|
||||||
output(1, "CONFLICT (rename/directory): Renamed %s->%s in %s "
|
output(1, "CONFLICT (rename/directory): Renamed %s->%s in %s "
|
||||||
" directory %s added in %s",
|
" directory %s added in %s",
|
||||||
@ -947,7 +947,7 @@ static int process_renames(struct path_list *a_renames,
|
|||||||
new_path = unique_path(ren1_dst, branch2);
|
new_path = unique_path(ren1_dst, branch2);
|
||||||
output(1, "Added as %s instead", new_path);
|
output(1, "Added as %s instead", new_path);
|
||||||
update_file(0, dst_other.sha1, dst_other.mode, new_path);
|
update_file(0, dst_other.sha1, dst_other.mode, new_path);
|
||||||
} else if ((item = path_list_lookup(ren1_dst, renames2Dst))) {
|
} else if ((item = string_list_lookup(ren1_dst, renames2Dst))) {
|
||||||
ren2 = item->util;
|
ren2 = item->util;
|
||||||
clean_merge = 0;
|
clean_merge = 0;
|
||||||
ren2->processed = 1;
|
ren2->processed = 1;
|
||||||
@ -1003,8 +1003,8 @@ static int process_renames(struct path_list *a_renames,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
path_list_clear(&a_by_dst, 0);
|
string_list_clear(&a_by_dst, 0);
|
||||||
path_list_clear(&b_by_dst, 0);
|
string_list_clear(&b_by_dst, 0);
|
||||||
|
|
||||||
return clean_merge;
|
return clean_merge;
|
||||||
}
|
}
|
||||||
@ -1082,7 +1082,7 @@ static int process_entry(const char *path, struct stage_data *entry,
|
|||||||
sha = b_sha;
|
sha = b_sha;
|
||||||
conf = "directory/file";
|
conf = "directory/file";
|
||||||
}
|
}
|
||||||
if (path_list_has_path(¤t_directory_set, path)) {
|
if (string_list_has_string(¤t_directory_set, path)) {
|
||||||
const char *new_path = unique_path(path, add_branch);
|
const char *new_path = unique_path(path, add_branch);
|
||||||
clean_merge = 0;
|
clean_merge = 0;
|
||||||
output(1, "CONFLICT (%s): There is a directory with name %s in %s. "
|
output(1, "CONFLICT (%s): There is a directory with name %s in %s. "
|
||||||
@ -1173,10 +1173,10 @@ int merge_trees(struct tree *head,
|
|||||||
sha1_to_hex(merge->object.sha1));
|
sha1_to_hex(merge->object.sha1));
|
||||||
|
|
||||||
if (unmerged_cache()) {
|
if (unmerged_cache()) {
|
||||||
struct path_list *entries, *re_head, *re_merge;
|
struct string_list *entries, *re_head, *re_merge;
|
||||||
int i;
|
int i;
|
||||||
path_list_clear(¤t_file_set, 1);
|
string_list_clear(¤t_file_set, 1);
|
||||||
path_list_clear(¤t_directory_set, 1);
|
string_list_clear(¤t_directory_set, 1);
|
||||||
get_files_dirs(head);
|
get_files_dirs(head);
|
||||||
get_files_dirs(merge);
|
get_files_dirs(merge);
|
||||||
|
|
||||||
@ -1186,16 +1186,16 @@ int merge_trees(struct tree *head,
|
|||||||
clean = process_renames(re_head, re_merge,
|
clean = process_renames(re_head, re_merge,
|
||||||
branch1, branch2);
|
branch1, branch2);
|
||||||
for (i = 0; i < entries->nr; i++) {
|
for (i = 0; i < entries->nr; i++) {
|
||||||
const char *path = entries->items[i].path;
|
const char *path = entries->items[i].string;
|
||||||
struct stage_data *e = entries->items[i].util;
|
struct stage_data *e = entries->items[i].util;
|
||||||
if (!e->processed
|
if (!e->processed
|
||||||
&& !process_entry(path, e, branch1, branch2))
|
&& !process_entry(path, e, branch1, branch2))
|
||||||
clean = 0;
|
clean = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
path_list_clear(re_merge, 0);
|
string_list_clear(re_merge, 0);
|
||||||
path_list_clear(re_head, 0);
|
string_list_clear(re_head, 0);
|
||||||
path_list_clear(entries, 1);
|
string_list_clear(entries, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
39
builtin-mv.c
39
builtin-mv.c
@ -7,7 +7,7 @@
|
|||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "cache-tree.h"
|
#include "cache-tree.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
|
|
||||||
static const char * const builtin_mv_usage[] = {
|
static const char * const builtin_mv_usage[] = {
|
||||||
@ -36,13 +36,14 @@ static const char **copy_pathspec(const char *prefix, const char **pathspec,
|
|||||||
return get_pathspec(prefix, result);
|
return get_pathspec(prefix, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_list(const char *label, struct path_list *list)
|
static void show_list(const char *label, struct string_list *list)
|
||||||
{
|
{
|
||||||
if (list->nr > 0) {
|
if (list->nr > 0) {
|
||||||
int i;
|
int i;
|
||||||
printf("%s", label);
|
printf("%s", label);
|
||||||
for (i = 0; i < list->nr; i++)
|
for (i = 0; i < list->nr; i++)
|
||||||
printf("%s%s", i > 0 ? ", " : "", list->items[i].path);
|
printf("%s%s", i > 0 ? ", " : "",
|
||||||
|
list->items[i].string);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,11 +76,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||||||
const char **source, **destination, **dest_path;
|
const char **source, **destination, **dest_path;
|
||||||
enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
|
enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct path_list overwritten = {NULL, 0, 0, 0};
|
struct string_list overwritten = {NULL, 0, 0, 0};
|
||||||
struct path_list src_for_dst = {NULL, 0, 0, 0};
|
struct string_list src_for_dst = {NULL, 0, 0, 0};
|
||||||
struct path_list added = {NULL, 0, 0, 0};
|
struct string_list added = {NULL, 0, 0, 0};
|
||||||
struct path_list deleted = {NULL, 0, 0, 0};
|
struct string_list deleted = {NULL, 0, 0, 0};
|
||||||
struct path_list changed = {NULL, 0, 0, 0};
|
struct string_list changed = {NULL, 0, 0, 0};
|
||||||
|
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
|
|
||||||
@ -189,16 +190,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||||||
" will overwrite!\n",
|
" will overwrite!\n",
|
||||||
bad);
|
bad);
|
||||||
bad = NULL;
|
bad = NULL;
|
||||||
path_list_insert(dst, &overwritten);
|
string_list_insert(dst, &overwritten);
|
||||||
} else
|
} else
|
||||||
bad = "Cannot overwrite";
|
bad = "Cannot overwrite";
|
||||||
}
|
}
|
||||||
} else if (cache_name_pos(src, length) < 0)
|
} else if (cache_name_pos(src, length) < 0)
|
||||||
bad = "not under version control";
|
bad = "not under version control";
|
||||||
else if (path_list_has_path(&src_for_dst, dst))
|
else if (string_list_has_string(&src_for_dst, dst))
|
||||||
bad = "multiple sources for the same target";
|
bad = "multiple sources for the same target";
|
||||||
else
|
else
|
||||||
path_list_insert(dst, &src_for_dst);
|
string_list_insert(dst, &src_for_dst);
|
||||||
|
|
||||||
if (bad) {
|
if (bad) {
|
||||||
if (ignore_errors) {
|
if (ignore_errors) {
|
||||||
@ -228,15 +229,15 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cache_name_pos(src, strlen(src)) >= 0) {
|
if (cache_name_pos(src, strlen(src)) >= 0) {
|
||||||
path_list_insert(src, &deleted);
|
string_list_insert(src, &deleted);
|
||||||
|
|
||||||
/* destination can be a directory with 1 file inside */
|
/* destination can be a directory with 1 file inside */
|
||||||
if (path_list_has_path(&overwritten, dst))
|
if (string_list_has_string(&overwritten, dst))
|
||||||
path_list_insert(dst, &changed);
|
string_list_insert(dst, &changed);
|
||||||
else
|
else
|
||||||
path_list_insert(dst, &added);
|
string_list_insert(dst, &added);
|
||||||
} else
|
} else
|
||||||
path_list_insert(dst, &added);
|
string_list_insert(dst, &added);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (show_only) {
|
if (show_only) {
|
||||||
@ -245,7 +246,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||||||
show_list("Deleting : ", &deleted);
|
show_list("Deleting : ", &deleted);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < changed.nr; i++) {
|
for (i = 0; i < changed.nr; i++) {
|
||||||
const char *path = changed.items[i].path;
|
const char *path = changed.items[i].string;
|
||||||
int j = cache_name_pos(path, strlen(path));
|
int j = cache_name_pos(path, strlen(path));
|
||||||
struct cache_entry *ce = active_cache[j];
|
struct cache_entry *ce = active_cache[j];
|
||||||
|
|
||||||
@ -255,13 +256,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < added.nr; i++) {
|
for (i = 0; i < added.nr; i++) {
|
||||||
const char *path = added.items[i].path;
|
const char *path = added.items[i].string;
|
||||||
if (add_file_to_cache(path, verbose ? ADD_CACHE_VERBOSE : 0))
|
if (add_file_to_cache(path, verbose ? ADD_CACHE_VERBOSE : 0))
|
||||||
die("updating index entries failed");
|
die("updating index entries failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < deleted.nr; i++)
|
for (i = 0; i < deleted.nr; i++)
|
||||||
remove_file_from_cache(deleted.items[i].path);
|
remove_file_from_cache(deleted.items[i].string);
|
||||||
|
|
||||||
if (active_cache_changed) {
|
if (active_cache_changed) {
|
||||||
if (write_cache(newfd, active_cache, active_nr) ||
|
if (write_cache(newfd, active_cache, active_nr) ||
|
||||||
|
124
builtin-remote.c
124
builtin-remote.c
@ -2,7 +2,7 @@
|
|||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
@ -31,11 +31,11 @@ static inline int postfixcmp(const char *string, const char *postfix)
|
|||||||
|
|
||||||
static int opt_parse_track(const struct option *opt, const char *arg, int not)
|
static int opt_parse_track(const struct option *opt, const char *arg, int not)
|
||||||
{
|
{
|
||||||
struct path_list *list = opt->value;
|
struct string_list *list = opt->value;
|
||||||
if (not)
|
if (not)
|
||||||
path_list_clear(list, 0);
|
string_list_clear(list, 0);
|
||||||
else
|
else
|
||||||
path_list_append(arg, list);
|
string_list_append(arg, list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ static int fetch_remote(const char *name)
|
|||||||
static int add(int argc, const char **argv)
|
static int add(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
int fetch = 0, mirror = 0;
|
int fetch = 0, mirror = 0;
|
||||||
struct path_list track = { NULL, 0, 0 };
|
struct string_list track = { NULL, 0, 0 };
|
||||||
const char *master = NULL;
|
const char *master = NULL;
|
||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
struct strbuf buf, buf2;
|
struct strbuf buf, buf2;
|
||||||
@ -96,18 +96,18 @@ static int add(int argc, const char **argv)
|
|||||||
strbuf_addf(&buf, "remote.%s.fetch", name);
|
strbuf_addf(&buf, "remote.%s.fetch", name);
|
||||||
|
|
||||||
if (track.nr == 0)
|
if (track.nr == 0)
|
||||||
path_list_append("*", &track);
|
string_list_append("*", &track);
|
||||||
for (i = 0; i < track.nr; i++) {
|
for (i = 0; i < track.nr; i++) {
|
||||||
struct path_list_item *item = track.items + i;
|
struct string_list_item *item = track.items + i;
|
||||||
|
|
||||||
strbuf_reset(&buf2);
|
strbuf_reset(&buf2);
|
||||||
strbuf_addch(&buf2, '+');
|
strbuf_addch(&buf2, '+');
|
||||||
if (mirror)
|
if (mirror)
|
||||||
strbuf_addf(&buf2, "refs/%s:refs/%s",
|
strbuf_addf(&buf2, "refs/%s:refs/%s",
|
||||||
item->path, item->path);
|
item->string, item->string);
|
||||||
else
|
else
|
||||||
strbuf_addf(&buf2, "refs/heads/%s:refs/remotes/%s/%s",
|
strbuf_addf(&buf2, "refs/heads/%s:refs/remotes/%s/%s",
|
||||||
item->path, name, item->path);
|
item->string, name, item->string);
|
||||||
if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
|
if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -135,17 +135,17 @@ static int add(int argc, const char **argv)
|
|||||||
|
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
strbuf_release(&buf2);
|
strbuf_release(&buf2);
|
||||||
path_list_clear(&track, 0);
|
string_list_clear(&track, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct branch_info {
|
struct branch_info {
|
||||||
char *remote;
|
char *remote;
|
||||||
struct path_list merge;
|
struct string_list merge;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct path_list branch_list;
|
static struct string_list branch_list;
|
||||||
|
|
||||||
static const char *abbrev_ref(const char *name, const char *prefix)
|
static const char *abbrev_ref(const char *name, const char *prefix)
|
||||||
{
|
{
|
||||||
@ -160,7 +160,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
|
|||||||
{
|
{
|
||||||
if (!prefixcmp(key, "branch.")) {
|
if (!prefixcmp(key, "branch.")) {
|
||||||
char *name;
|
char *name;
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct branch_info *info;
|
struct branch_info *info;
|
||||||
enum { REMOTE, MERGE } type;
|
enum { REMOTE, MERGE } type;
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
|
|||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
item = path_list_insert(name, &branch_list);
|
item = string_list_insert(name, &branch_list);
|
||||||
|
|
||||||
if (!item->util)
|
if (!item->util)
|
||||||
item->util = xcalloc(sizeof(struct branch_info), 1);
|
item->util = xcalloc(sizeof(struct branch_info), 1);
|
||||||
@ -189,11 +189,11 @@ static int config_read_branches(const char *key, const char *value, void *cb)
|
|||||||
while (space) {
|
while (space) {
|
||||||
char *merge;
|
char *merge;
|
||||||
merge = xstrndup(value, space - value);
|
merge = xstrndup(value, space - value);
|
||||||
path_list_append(merge, &info->merge);
|
string_list_append(merge, &info->merge);
|
||||||
value = abbrev_branch(space + 1);
|
value = abbrev_branch(space + 1);
|
||||||
space = strchr(value, ' ');
|
space = strchr(value, ' ');
|
||||||
}
|
}
|
||||||
path_list_append(xstrdup(value), &info->merge);
|
string_list_append(xstrdup(value), &info->merge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -204,12 +204,12 @@ static void read_branches(void)
|
|||||||
if (branch_list.nr)
|
if (branch_list.nr)
|
||||||
return;
|
return;
|
||||||
git_config(config_read_branches, NULL);
|
git_config(config_read_branches, NULL);
|
||||||
sort_path_list(&branch_list);
|
sort_string_list(&branch_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ref_states {
|
struct ref_states {
|
||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
struct path_list new, stale, tracked;
|
struct string_list new, stale, tracked;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int handle_one_branch(const char *refname,
|
static int handle_one_branch(const char *refname,
|
||||||
@ -221,16 +221,16 @@ static int handle_one_branch(const char *refname,
|
|||||||
memset(&refspec, 0, sizeof(refspec));
|
memset(&refspec, 0, sizeof(refspec));
|
||||||
refspec.dst = (char *)refname;
|
refspec.dst = (char *)refname;
|
||||||
if (!remote_find_tracking(states->remote, &refspec)) {
|
if (!remote_find_tracking(states->remote, &refspec)) {
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
const char *name = abbrev_branch(refspec.src);
|
const char *name = abbrev_branch(refspec.src);
|
||||||
/* symbolic refs pointing nowhere were handled already */
|
/* symbolic refs pointing nowhere were handled already */
|
||||||
if ((flags & REF_ISSYMREF) ||
|
if ((flags & REF_ISSYMREF) ||
|
||||||
unsorted_path_list_has_path(&states->tracked,
|
unsorted_string_list_has_string(&states->tracked,
|
||||||
name) ||
|
name) ||
|
||||||
unsorted_path_list_has_path(&states->new,
|
unsorted_string_list_has_string(&states->new,
|
||||||
name))
|
name))
|
||||||
return 0;
|
return 0;
|
||||||
item = path_list_append(name, &states->stale);
|
item = string_list_append(name, &states->stale);
|
||||||
item->util = xstrdup(refname);
|
item->util = xstrdup(refname);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -246,9 +246,9 @@ static int get_ref_states(const struct ref *ref, struct ref_states *states)
|
|||||||
die("Could not get fetch map for refspec %s",
|
die("Could not get fetch map for refspec %s",
|
||||||
states->remote->fetch_refspec[i]);
|
states->remote->fetch_refspec[i]);
|
||||||
|
|
||||||
states->new.strdup_paths = states->tracked.strdup_paths = 1;
|
states->new.strdup_strings = states->tracked.strdup_strings = 1;
|
||||||
for (ref = fetch_map; ref; ref = ref->next) {
|
for (ref = fetch_map; ref; ref = ref->next) {
|
||||||
struct path_list *target = &states->tracked;
|
struct string_list *target = &states->tracked;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
void *util = NULL;
|
void *util = NULL;
|
||||||
|
|
||||||
@ -259,12 +259,12 @@ static int get_ref_states(const struct ref *ref, struct ref_states *states)
|
|||||||
if (hashcmp(sha1, ref->new_sha1))
|
if (hashcmp(sha1, ref->new_sha1))
|
||||||
util = &states;
|
util = &states;
|
||||||
}
|
}
|
||||||
path_list_append(abbrev_branch(ref->name), target)->util = util;
|
string_list_append(abbrev_branch(ref->name), target)->util = util;
|
||||||
}
|
}
|
||||||
free_refs(fetch_map);
|
free_refs(fetch_map);
|
||||||
|
|
||||||
for_each_ref(handle_one_branch, states);
|
for_each_ref(handle_one_branch, states);
|
||||||
sort_path_list(&states->stale);
|
sort_string_list(&states->stale);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -296,7 +296,7 @@ static int add_known_remote(struct remote *remote, void *cb_data)
|
|||||||
|
|
||||||
struct branches_for_remote {
|
struct branches_for_remote {
|
||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
struct path_list *branches;
|
struct string_list *branches;
|
||||||
struct known_remotes *keep;
|
struct known_remotes *keep;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -305,7 +305,7 @@ static int add_branch_for_removal(const char *refname,
|
|||||||
{
|
{
|
||||||
struct branches_for_remote *branches = cb_data;
|
struct branches_for_remote *branches = cb_data;
|
||||||
struct refspec refspec;
|
struct refspec refspec;
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct known_remote *kr;
|
struct known_remote *kr;
|
||||||
|
|
||||||
memset(&refspec, 0, sizeof(refspec));
|
memset(&refspec, 0, sizeof(refspec));
|
||||||
@ -325,19 +325,19 @@ static int add_branch_for_removal(const char *refname,
|
|||||||
if (flags & REF_ISSYMREF)
|
if (flags & REF_ISSYMREF)
|
||||||
return unlink(git_path(refname));
|
return unlink(git_path(refname));
|
||||||
|
|
||||||
item = path_list_append(refname, branches->branches);
|
item = string_list_append(refname, branches->branches);
|
||||||
item->util = xmalloc(20);
|
item->util = xmalloc(20);
|
||||||
hashcpy(item->util, sha1);
|
hashcpy(item->util, sha1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int remove_branches(struct path_list *branches)
|
static int remove_branches(struct string_list *branches)
|
||||||
{
|
{
|
||||||
int i, result = 0;
|
int i, result = 0;
|
||||||
for (i = 0; i < branches->nr; i++) {
|
for (i = 0; i < branches->nr; i++) {
|
||||||
struct path_list_item *item = branches->items + i;
|
struct string_list_item *item = branches->items + i;
|
||||||
const char *refname = item->path;
|
const char *refname = item->string;
|
||||||
unsigned char *sha1 = item->util;
|
unsigned char *sha1 = item->util;
|
||||||
|
|
||||||
if (delete_ref(refname, sha1))
|
if (delete_ref(refname, sha1))
|
||||||
@ -354,7 +354,7 @@ static int rm(int argc, const char **argv)
|
|||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
struct strbuf buf;
|
struct strbuf buf;
|
||||||
struct known_remotes known_remotes = { NULL, NULL };
|
struct known_remotes known_remotes = { NULL, NULL };
|
||||||
struct path_list branches = { NULL, 0, 0, 1 };
|
struct string_list branches = { NULL, 0, 0, 1 };
|
||||||
struct branches_for_remote cb_data = { NULL, &branches, &known_remotes };
|
struct branches_for_remote cb_data = { NULL, &branches, &known_remotes };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -375,14 +375,14 @@ static int rm(int argc, const char **argv)
|
|||||||
|
|
||||||
read_branches();
|
read_branches();
|
||||||
for (i = 0; i < branch_list.nr; i++) {
|
for (i = 0; i < branch_list.nr; i++) {
|
||||||
struct path_list_item *item = branch_list.items + i;
|
struct string_list_item *item = branch_list.items + i;
|
||||||
struct branch_info *info = item->util;
|
struct branch_info *info = item->util;
|
||||||
if (info->remote && !strcmp(info->remote, remote->name)) {
|
if (info->remote && !strcmp(info->remote, remote->name)) {
|
||||||
const char *keys[] = { "remote", "merge", NULL }, **k;
|
const char *keys[] = { "remote", "merge", NULL }, **k;
|
||||||
for (k = keys; *k; k++) {
|
for (k = keys; *k; k++) {
|
||||||
strbuf_reset(&buf);
|
strbuf_reset(&buf);
|
||||||
strbuf_addf(&buf, "branch.%s.%s",
|
strbuf_addf(&buf, "branch.%s.%s",
|
||||||
item->path, *k);
|
item->string, *k);
|
||||||
if (git_config_set(buf.buf, NULL)) {
|
if (git_config_set(buf.buf, NULL)) {
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
return -1;
|
return -1;
|
||||||
@ -402,12 +402,12 @@ static int rm(int argc, const char **argv)
|
|||||||
|
|
||||||
if (!i)
|
if (!i)
|
||||||
i = remove_branches(&branches);
|
i = remove_branches(&branches);
|
||||||
path_list_clear(&branches, 1);
|
string_list_clear(&branches, 1);
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_list(const char *title, struct path_list *list)
|
static void show_list(const char *title, struct string_list *list)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -417,7 +417,7 @@ static void show_list(const char *title, struct path_list *list)
|
|||||||
printf(title, list->nr > 1 ? "es" : "");
|
printf(title, list->nr > 1 ? "es" : "");
|
||||||
printf("\n ");
|
printf("\n ");
|
||||||
for (i = 0; i < list->nr; i++)
|
for (i = 0; i < list->nr; i++)
|
||||||
printf("%s%s", i ? " " : "", list->items[i].path);
|
printf("%s%s", i ? " " : "", list->items[i].string);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,7 +455,7 @@ static int append_ref_to_tracked_list(const char *refname,
|
|||||||
memset(&refspec, 0, sizeof(refspec));
|
memset(&refspec, 0, sizeof(refspec));
|
||||||
refspec.dst = (char *)refname;
|
refspec.dst = (char *)refname;
|
||||||
if (!remote_find_tracking(states->remote, &refspec))
|
if (!remote_find_tracking(states->remote, &refspec))
|
||||||
path_list_append(abbrev_branch(refspec.src), &states->tracked);
|
string_list_append(abbrev_branch(refspec.src), &states->tracked);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -487,7 +487,7 @@ static int show(int argc, const char **argv)
|
|||||||
states.remote->url[0] : "(no URL)");
|
states.remote->url[0] : "(no URL)");
|
||||||
|
|
||||||
for (i = 0; i < branch_list.nr; i++) {
|
for (i = 0; i < branch_list.nr; i++) {
|
||||||
struct path_list_item *branch = branch_list.items + i;
|
struct string_list_item *branch = branch_list.items + i;
|
||||||
struct branch_info *info = branch->util;
|
struct branch_info *info = branch->util;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@ -496,9 +496,9 @@ static int show(int argc, const char **argv)
|
|||||||
printf(" Remote branch%s merged with 'git pull' "
|
printf(" Remote branch%s merged with 'git pull' "
|
||||||
"while on branch %s\n ",
|
"while on branch %s\n ",
|
||||||
info->merge.nr > 1 ? "es" : "",
|
info->merge.nr > 1 ? "es" : "",
|
||||||
branch->path);
|
branch->string);
|
||||||
for (j = 0; j < info->merge.nr; j++)
|
for (j = 0; j < info->merge.nr; j++)
|
||||||
printf(" %s", info->merge.items[j].path);
|
printf(" %s", info->merge.items[j].string);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -531,9 +531,9 @@ static int show(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* NEEDSWORK: free remote */
|
/* NEEDSWORK: free remote */
|
||||||
path_list_clear(&states.new, 0);
|
string_list_clear(&states.new, 0);
|
||||||
path_list_clear(&states.stale, 0);
|
string_list_clear(&states.stale, 0);
|
||||||
path_list_clear(&states.tracked, 0);
|
string_list_clear(&states.tracked, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -579,9 +579,9 @@ static int prune(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* NEEDSWORK: free remote */
|
/* NEEDSWORK: free remote */
|
||||||
path_list_clear(&states.new, 0);
|
string_list_clear(&states.new, 0);
|
||||||
path_list_clear(&states.stale, 0);
|
string_list_clear(&states.stale, 0);
|
||||||
path_list_clear(&states.tracked, 0);
|
string_list_clear(&states.tracked, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -589,15 +589,15 @@ static int prune(int argc, const char **argv)
|
|||||||
|
|
||||||
static int get_one_remote_for_update(struct remote *remote, void *priv)
|
static int get_one_remote_for_update(struct remote *remote, void *priv)
|
||||||
{
|
{
|
||||||
struct path_list *list = priv;
|
struct string_list *list = priv;
|
||||||
if (!remote->skip_default_update)
|
if (!remote->skip_default_update)
|
||||||
path_list_append(xstrdup(remote->name), list);
|
string_list_append(xstrdup(remote->name), list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct remote_group {
|
struct remote_group {
|
||||||
const char *name;
|
const char *name;
|
||||||
struct path_list *list;
|
struct string_list *list;
|
||||||
} remote_group;
|
} remote_group;
|
||||||
|
|
||||||
static int get_remote_group(const char *key, const char *value, void *cb)
|
static int get_remote_group(const char *key, const char *value, void *cb)
|
||||||
@ -608,7 +608,7 @@ static int get_remote_group(const char *key, const char *value, void *cb)
|
|||||||
int space = strcspn(value, " \t\n");
|
int space = strcspn(value, " \t\n");
|
||||||
while (*value) {
|
while (*value) {
|
||||||
if (space > 1)
|
if (space > 1)
|
||||||
path_list_append(xstrndup(value, space),
|
string_list_append(xstrndup(value, space),
|
||||||
remote_group.list);
|
remote_group.list);
|
||||||
value += space + (value[space] != '\0');
|
value += space + (value[space] != '\0');
|
||||||
space = strcspn(value, " \t\n");
|
space = strcspn(value, " \t\n");
|
||||||
@ -621,7 +621,7 @@ static int get_remote_group(const char *key, const char *value, void *cb)
|
|||||||
static int update(int argc, const char **argv)
|
static int update(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
int i, result = 0;
|
int i, result = 0;
|
||||||
struct path_list list = { NULL, 0, 0, 0 };
|
struct string_list list = { NULL, 0, 0, 0 };
|
||||||
static const char *default_argv[] = { NULL, "default", NULL };
|
static const char *default_argv[] = { NULL, "default", NULL };
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
@ -639,20 +639,20 @@ static int update(int argc, const char **argv)
|
|||||||
result = for_each_remote(get_one_remote_for_update, &list);
|
result = for_each_remote(get_one_remote_for_update, &list);
|
||||||
|
|
||||||
for (i = 0; i < list.nr; i++)
|
for (i = 0; i < list.nr; i++)
|
||||||
result |= fetch_remote(list.items[i].path);
|
result |= fetch_remote(list.items[i].string);
|
||||||
|
|
||||||
/* all names were strdup()ed or strndup()ed */
|
/* all names were strdup()ed or strndup()ed */
|
||||||
list.strdup_paths = 1;
|
list.strdup_strings = 1;
|
||||||
path_list_clear(&list, 0);
|
string_list_clear(&list, 0);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_one_entry(struct remote *remote, void *priv)
|
static int get_one_entry(struct remote *remote, void *priv)
|
||||||
{
|
{
|
||||||
struct path_list *list = priv;
|
struct string_list *list = priv;
|
||||||
|
|
||||||
path_list_append(remote->name, list)->util = remote->url_nr ?
|
string_list_append(remote->name, list)->util = remote->url_nr ?
|
||||||
(void *)remote->url[0] : NULL;
|
(void *)remote->url[0] : NULL;
|
||||||
if (remote->url_nr > 1)
|
if (remote->url_nr > 1)
|
||||||
warning("Remote %s has more than one URL", remote->name);
|
warning("Remote %s has more than one URL", remote->name);
|
||||||
@ -662,16 +662,16 @@ static int get_one_entry(struct remote *remote, void *priv)
|
|||||||
|
|
||||||
static int show_all(void)
|
static int show_all(void)
|
||||||
{
|
{
|
||||||
struct path_list list = { NULL, 0, 0 };
|
struct string_list list = { NULL, 0, 0 };
|
||||||
int result = for_each_remote(get_one_entry, &list);
|
int result = for_each_remote(get_one_entry, &list);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sort_path_list(&list);
|
sort_string_list(&list);
|
||||||
for (i = 0; i < list.nr; i++) {
|
for (i = 0; i < list.nr; i++) {
|
||||||
struct path_list_item *item = list.items + i;
|
struct string_list_item *item = list.items + i;
|
||||||
printf("%s%s%s\n", item->path,
|
printf("%s%s%s\n", item->string,
|
||||||
verbose ? "\t" : "",
|
verbose ? "\t" : "",
|
||||||
verbose && item->util ?
|
verbose && item->util ?
|
||||||
(const char *)item->util : "");
|
(const char *)item->util : "");
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "rerere.h"
|
#include "rerere.h"
|
||||||
#include "xdiff/xdiff.h"
|
#include "xdiff/xdiff.h"
|
||||||
#include "xdiff-interface.h"
|
#include "xdiff-interface.h"
|
||||||
@ -48,9 +48,9 @@ static int git_rerere_gc_config(const char *var, const char *value, void *cb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void garbage_collect(struct path_list *rr)
|
static void garbage_collect(struct string_list *rr)
|
||||||
{
|
{
|
||||||
struct path_list to_remove = { NULL, 0, 0, 1 };
|
struct string_list to_remove = { NULL, 0, 0, 1 };
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
int i, cutoff;
|
int i, cutoff;
|
||||||
@ -69,11 +69,11 @@ static void garbage_collect(struct path_list *rr)
|
|||||||
cutoff = (has_resolution(name)
|
cutoff = (has_resolution(name)
|
||||||
? cutoff_resolve : cutoff_noresolve);
|
? cutoff_resolve : cutoff_noresolve);
|
||||||
if (then < now - cutoff * 86400)
|
if (then < now - cutoff * 86400)
|
||||||
path_list_append(name, &to_remove);
|
string_list_append(name, &to_remove);
|
||||||
}
|
}
|
||||||
for (i = 0; i < to_remove.nr; i++)
|
for (i = 0; i < to_remove.nr; i++)
|
||||||
unlink_rr_item(to_remove.items[i].path);
|
unlink_rr_item(to_remove.items[i].string);
|
||||||
path_list_clear(&to_remove, 0);
|
string_list_clear(&to_remove, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int outf(void *dummy, mmbuffer_t *ptr, int nbuf)
|
static int outf(void *dummy, mmbuffer_t *ptr, int nbuf)
|
||||||
@ -111,7 +111,7 @@ static int diff_two(const char *file1, const char *label1,
|
|||||||
|
|
||||||
int cmd_rerere(int argc, const char **argv, const char *prefix)
|
int cmd_rerere(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct path_list merge_rr = { NULL, 0, 0, 1 };
|
struct string_list merge_rr = { NULL, 0, 0, 1 };
|
||||||
int i, fd;
|
int i, fd;
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
@ -132,16 +132,16 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
|
|||||||
garbage_collect(&merge_rr);
|
garbage_collect(&merge_rr);
|
||||||
else if (!strcmp(argv[1], "status"))
|
else if (!strcmp(argv[1], "status"))
|
||||||
for (i = 0; i < merge_rr.nr; i++)
|
for (i = 0; i < merge_rr.nr; i++)
|
||||||
printf("%s\n", merge_rr.items[i].path);
|
printf("%s\n", merge_rr.items[i].string);
|
||||||
else if (!strcmp(argv[1], "diff"))
|
else if (!strcmp(argv[1], "diff"))
|
||||||
for (i = 0; i < merge_rr.nr; i++) {
|
for (i = 0; i < merge_rr.nr; i++) {
|
||||||
const char *path = merge_rr.items[i].path;
|
const char *path = merge_rr.items[i].string;
|
||||||
const char *name = (const char *)merge_rr.items[i].util;
|
const char *name = (const char *)merge_rr.items[i].util;
|
||||||
diff_two(rr_path(name, "preimage"), path, path, path);
|
diff_two(rr_path(name, "preimage"), path, path, path);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
usage(git_rerere_usage);
|
usage(git_rerere_usage);
|
||||||
|
|
||||||
path_list_clear(&merge_rr, 1);
|
string_list_clear(&merge_rr, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "commit.h"
|
#include "commit.h"
|
||||||
#include "diff.h"
|
#include "diff.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "mailmap.h"
|
#include "mailmap.h"
|
||||||
@ -18,8 +18,8 @@ static char const * const shortlog_usage[] = {
|
|||||||
|
|
||||||
static int compare_by_number(const void *a1, const void *a2)
|
static int compare_by_number(const void *a1, const void *a2)
|
||||||
{
|
{
|
||||||
const struct path_list_item *i1 = a1, *i2 = a2;
|
const struct string_list_item *i1 = a1, *i2 = a2;
|
||||||
const struct path_list *l1 = i1->util, *l2 = i2->util;
|
const struct string_list *l1 = i1->util, *l2 = i2->util;
|
||||||
|
|
||||||
if (l1->nr < l2->nr)
|
if (l1->nr < l2->nr)
|
||||||
return 1;
|
return 1;
|
||||||
@ -35,8 +35,8 @@ static void insert_one_record(struct shortlog *log,
|
|||||||
{
|
{
|
||||||
const char *dot3 = log->common_repo_prefix;
|
const char *dot3 = log->common_repo_prefix;
|
||||||
char *buffer, *p;
|
char *buffer, *p;
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct path_list *onelines;
|
struct string_list *onelines;
|
||||||
char namebuf[1024];
|
char namebuf[1024];
|
||||||
size_t len;
|
size_t len;
|
||||||
const char *eol;
|
const char *eol;
|
||||||
@ -69,9 +69,9 @@ static void insert_one_record(struct shortlog *log,
|
|||||||
}
|
}
|
||||||
|
|
||||||
buffer = xstrdup(namebuf);
|
buffer = xstrdup(namebuf);
|
||||||
item = path_list_insert(buffer, &log->list);
|
item = string_list_insert(buffer, &log->list);
|
||||||
if (item->util == NULL)
|
if (item->util == NULL)
|
||||||
item->util = xcalloc(1, sizeof(struct path_list));
|
item->util = xcalloc(1, sizeof(struct string_list));
|
||||||
else
|
else
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
@ -109,11 +109,11 @@ static void insert_one_record(struct shortlog *log,
|
|||||||
onelines->alloc = alloc_nr(onelines->nr);
|
onelines->alloc = alloc_nr(onelines->nr);
|
||||||
onelines->items = xrealloc(onelines->items,
|
onelines->items = xrealloc(onelines->items,
|
||||||
onelines->alloc
|
onelines->alloc
|
||||||
* sizeof(struct path_list_item));
|
* sizeof(struct string_list_item));
|
||||||
}
|
}
|
||||||
|
|
||||||
onelines->items[onelines->nr].util = NULL;
|
onelines->items[onelines->nr].util = NULL;
|
||||||
onelines->items[onelines->nr++].path = buffer;
|
onelines->items[onelines->nr++].string = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_from_stdin(struct shortlog *log)
|
static void read_from_stdin(struct shortlog *log)
|
||||||
@ -231,7 +231,7 @@ void shortlog_init(struct shortlog *log)
|
|||||||
|
|
||||||
read_mailmap(&log->mailmap, ".mailmap", &log->common_repo_prefix);
|
read_mailmap(&log->mailmap, ".mailmap", &log->common_repo_prefix);
|
||||||
|
|
||||||
log->list.strdup_paths = 1;
|
log->list.strdup_strings = 1;
|
||||||
log->wrap = DEFAULT_WRAPLEN;
|
log->wrap = DEFAULT_WRAPLEN;
|
||||||
log->in1 = DEFAULT_INDENT1;
|
log->in1 = DEFAULT_INDENT1;
|
||||||
log->in2 = DEFAULT_INDENT2;
|
log->in2 = DEFAULT_INDENT2;
|
||||||
@ -299,17 +299,17 @@ void shortlog_output(struct shortlog *log)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
if (log->sort_by_number)
|
if (log->sort_by_number)
|
||||||
qsort(log->list.items, log->list.nr, sizeof(struct path_list_item),
|
qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
|
||||||
compare_by_number);
|
compare_by_number);
|
||||||
for (i = 0; i < log->list.nr; i++) {
|
for (i = 0; i < log->list.nr; i++) {
|
||||||
struct path_list *onelines = log->list.items[i].util;
|
struct string_list *onelines = log->list.items[i].util;
|
||||||
|
|
||||||
if (log->summary) {
|
if (log->summary) {
|
||||||
printf("%6d\t%s\n", onelines->nr, log->list.items[i].path);
|
printf("%6d\t%s\n", onelines->nr, log->list.items[i].string);
|
||||||
} else {
|
} else {
|
||||||
printf("%s (%d):\n", log->list.items[i].path, onelines->nr);
|
printf("%s (%d):\n", log->list.items[i].string, onelines->nr);
|
||||||
for (j = onelines->nr - 1; j >= 0; j--) {
|
for (j = onelines->nr - 1; j >= 0; j--) {
|
||||||
const char *msg = onelines->items[j].path;
|
const char *msg = onelines->items[j].string;
|
||||||
|
|
||||||
if (log->wrap_lines) {
|
if (log->wrap_lines) {
|
||||||
int col = print_wrapped_text(msg, log->in1, log->in2, log->wrap);
|
int col = print_wrapped_text(msg, log->in1, log->in2, log->wrap);
|
||||||
@ -322,14 +322,14 @@ void shortlog_output(struct shortlog *log)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
onelines->strdup_paths = 1;
|
onelines->strdup_strings = 1;
|
||||||
path_list_clear(onelines, 1);
|
string_list_clear(onelines, 1);
|
||||||
free(onelines);
|
free(onelines);
|
||||||
log->list.items[i].util = NULL;
|
log->list.items[i].util = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
log->list.strdup_paths = 1;
|
log->list.strdup_strings = 1;
|
||||||
path_list_clear(&log->list, 1);
|
string_list_clear(&log->list, 1);
|
||||||
log->mailmap.strdup_paths = 1;
|
log->mailmap.strdup_strings = 1;
|
||||||
path_list_clear(&log->mailmap, 1);
|
string_list_clear(&log->mailmap, 1);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=<length>]] [--abbrev[=<length>]] [--tags] [--heads] [--] [pattern*] < ref-list";
|
static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=<length>]] [--abbrev[=<length>]] [--tags] [--heads] [--] [pattern*] < ref-list";
|
||||||
|
|
||||||
@ -98,8 +98,8 @@ match:
|
|||||||
|
|
||||||
static int add_existing(const char *refname, const unsigned char *sha1, int flag, void *cbdata)
|
static int add_existing(const char *refname, const unsigned char *sha1, int flag, void *cbdata)
|
||||||
{
|
{
|
||||||
struct path_list *list = (struct path_list *)cbdata;
|
struct string_list *list = (struct string_list *)cbdata;
|
||||||
path_list_insert(refname, list);
|
string_list_insert(refname, list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ static int add_existing(const char *refname, const unsigned char *sha1, int flag
|
|||||||
*/
|
*/
|
||||||
static int exclude_existing(const char *match)
|
static int exclude_existing(const char *match)
|
||||||
{
|
{
|
||||||
static struct path_list existing_refs = { NULL, 0, 0, 0 };
|
static struct string_list existing_refs = { NULL, 0, 0, 0 };
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int matchlen = match ? strlen(match) : 0;
|
int matchlen = match ? strlen(match) : 0;
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ static int exclude_existing(const char *match)
|
|||||||
fprintf(stderr, "warning: ref '%s' ignored\n", ref);
|
fprintf(stderr, "warning: ref '%s' ignored\n", ref);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!path_list_has_path(&existing_refs, ref)) {
|
if (!string_list_has_string(&existing_refs, ref)) {
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,9 +14,9 @@
|
|||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "log-tree.h"
|
#include "log-tree.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
static int read_directory(const char *path, struct path_list *list)
|
static int read_directory(const char *path, struct string_list *list)
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
@ -26,7 +26,7 @@ static int read_directory(const char *path, struct path_list *list)
|
|||||||
|
|
||||||
while ((e = readdir(dir)))
|
while ((e = readdir(dir)))
|
||||||
if (strcmp(".", e->d_name) && strcmp("..", e->d_name))
|
if (strcmp(".", e->d_name) && strcmp("..", e->d_name))
|
||||||
path_list_insert(e->d_name, list);
|
string_list_insert(e->d_name, list);
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
return 0;
|
return 0;
|
||||||
@ -60,13 +60,13 @@ static int queue_diff(struct diff_options *o,
|
|||||||
|
|
||||||
if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
|
if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
|
||||||
char buffer1[PATH_MAX], buffer2[PATH_MAX];
|
char buffer1[PATH_MAX], buffer2[PATH_MAX];
|
||||||
struct path_list p1 = {NULL, 0, 0, 1}, p2 = {NULL, 0, 0, 1};
|
struct string_list p1 = {NULL, 0, 0, 1}, p2 = {NULL, 0, 0, 1};
|
||||||
int len1 = 0, len2 = 0, i1, i2, ret = 0;
|
int len1 = 0, len2 = 0, i1, i2, ret = 0;
|
||||||
|
|
||||||
if (name1 && read_directory(name1, &p1))
|
if (name1 && read_directory(name1, &p1))
|
||||||
return -1;
|
return -1;
|
||||||
if (name2 && read_directory(name2, &p2)) {
|
if (name2 && read_directory(name2, &p2)) {
|
||||||
path_list_clear(&p1, 0);
|
string_list_clear(&p1, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,14 +95,14 @@ static int queue_diff(struct diff_options *o,
|
|||||||
else if (i2 == p2.nr)
|
else if (i2 == p2.nr)
|
||||||
comp = -1;
|
comp = -1;
|
||||||
else
|
else
|
||||||
comp = strcmp(p1.items[i1].path,
|
comp = strcmp(p1.items[i1].string,
|
||||||
p2.items[i2].path);
|
p2.items[i2].string);
|
||||||
|
|
||||||
if (comp > 0)
|
if (comp > 0)
|
||||||
n1 = NULL;
|
n1 = NULL;
|
||||||
else {
|
else {
|
||||||
n1 = buffer1;
|
n1 = buffer1;
|
||||||
strncpy(buffer1 + len1, p1.items[i1++].path,
|
strncpy(buffer1 + len1, p1.items[i1++].string,
|
||||||
PATH_MAX - len1);
|
PATH_MAX - len1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,14 +110,14 @@ static int queue_diff(struct diff_options *o,
|
|||||||
n2 = NULL;
|
n2 = NULL;
|
||||||
else {
|
else {
|
||||||
n2 = buffer2;
|
n2 = buffer2;
|
||||||
strncpy(buffer2 + len2, p2.items[i2++].path,
|
strncpy(buffer2 + len2, p2.items[i2++].string,
|
||||||
PATH_MAX - len2);
|
PATH_MAX - len2);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = queue_diff(o, n1, n2);
|
ret = queue_diff(o, n1, n2);
|
||||||
}
|
}
|
||||||
path_list_clear(&p1, 0);
|
string_list_clear(&p1, 0);
|
||||||
path_list_clear(&p2, 0);
|
string_list_clear(&p2, 0);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
|
12
mailmap.c
12
mailmap.c
@ -1,8 +1,8 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "mailmap.h"
|
#include "mailmap.h"
|
||||||
|
|
||||||
int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev)
|
int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev)
|
||||||
{
|
{
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
FILE *f = fopen(filename, "r");
|
FILE *f = fopen(filename, "r");
|
||||||
@ -54,16 +54,16 @@ int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev
|
|||||||
for (i = 0; i < right_bracket - left_bracket - 1; i++)
|
for (i = 0; i < right_bracket - left_bracket - 1; i++)
|
||||||
email[i] = tolower(left_bracket[i + 1]);
|
email[i] = tolower(left_bracket[i + 1]);
|
||||||
email[right_bracket - left_bracket - 1] = '\0';
|
email[right_bracket - left_bracket - 1] = '\0';
|
||||||
path_list_insert(email, map)->util = name;
|
string_list_insert(email, map)->util = name;
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int map_email(struct path_list *map, const char *email, char *name, int maxlen)
|
int map_email(struct string_list *map, const char *email, char *name, int maxlen)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
char buf[1024], *mailbuf;
|
char buf[1024], *mailbuf;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ int map_email(struct path_list *map, const char *email, char *name, int maxlen)
|
|||||||
for (i = 0; i < p - email; i++)
|
for (i = 0; i < p - email; i++)
|
||||||
mailbuf[i] = tolower(email[i]);
|
mailbuf[i] = tolower(email[i]);
|
||||||
mailbuf[i] = 0;
|
mailbuf[i] = 0;
|
||||||
item = path_list_lookup(mailbuf, map);
|
item = string_list_lookup(mailbuf, map);
|
||||||
if (mailbuf != buf)
|
if (mailbuf != buf)
|
||||||
free(mailbuf);
|
free(mailbuf);
|
||||||
if (item != NULL) {
|
if (item != NULL) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef MAILMAP_H
|
#ifndef MAILMAP_H
|
||||||
#define MAILMAP_H
|
#define MAILMAP_H
|
||||||
|
|
||||||
int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev);
|
int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev);
|
||||||
int map_email(struct path_list *mailmap, const char *email, char *name, int maxlen);
|
int map_email(struct string_list *mailmap, const char *email, char *name, int maxlen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
134
path-list.c
134
path-list.c
@ -1,134 +0,0 @@
|
|||||||
#include "cache.h"
|
|
||||||
#include "path-list.h"
|
|
||||||
|
|
||||||
/* if there is no exact match, point to the index where the entry could be
|
|
||||||
* inserted */
|
|
||||||
static int get_entry_index(const struct path_list *list, const char *path,
|
|
||||||
int *exact_match)
|
|
||||||
{
|
|
||||||
int left = -1, right = list->nr;
|
|
||||||
|
|
||||||
while (left + 1 < right) {
|
|
||||||
int middle = (left + right) / 2;
|
|
||||||
int compare = strcmp(path, list->items[middle].path);
|
|
||||||
if (compare < 0)
|
|
||||||
right = middle;
|
|
||||||
else if (compare > 0)
|
|
||||||
left = middle;
|
|
||||||
else {
|
|
||||||
*exact_match = 1;
|
|
||||||
return middle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*exact_match = 0;
|
|
||||||
return right;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* returns -1-index if already exists */
|
|
||||||
static int add_entry(struct path_list *list, const char *path)
|
|
||||||
{
|
|
||||||
int exact_match;
|
|
||||||
int index = get_entry_index(list, path, &exact_match);
|
|
||||||
|
|
||||||
if (exact_match)
|
|
||||||
return -1 - index;
|
|
||||||
|
|
||||||
if (list->nr + 1 >= list->alloc) {
|
|
||||||
list->alloc += 32;
|
|
||||||
list->items = xrealloc(list->items, list->alloc
|
|
||||||
* sizeof(struct path_list_item));
|
|
||||||
}
|
|
||||||
if (index < list->nr)
|
|
||||||
memmove(list->items + index + 1, list->items + index,
|
|
||||||
(list->nr - index)
|
|
||||||
* sizeof(struct path_list_item));
|
|
||||||
list->items[index].path = list->strdup_paths ?
|
|
||||||
xstrdup(path) : (char *)path;
|
|
||||||
list->items[index].util = NULL;
|
|
||||||
list->nr++;
|
|
||||||
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct path_list_item *path_list_insert(const char *path, struct path_list *list)
|
|
||||||
{
|
|
||||||
int index = add_entry(list, path);
|
|
||||||
|
|
||||||
if (index < 0)
|
|
||||||
index = -1 - index;
|
|
||||||
|
|
||||||
return list->items + index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int path_list_has_path(const struct path_list *list, const char *path)
|
|
||||||
{
|
|
||||||
int exact_match;
|
|
||||||
get_entry_index(list, path, &exact_match);
|
|
||||||
return exact_match;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct path_list_item *path_list_lookup(const char *path, struct path_list *list)
|
|
||||||
{
|
|
||||||
int exact_match, i = get_entry_index(list, path, &exact_match);
|
|
||||||
if (!exact_match)
|
|
||||||
return NULL;
|
|
||||||
return list->items + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
void path_list_clear(struct path_list *list, int free_util)
|
|
||||||
{
|
|
||||||
if (list->items) {
|
|
||||||
int i;
|
|
||||||
if (list->strdup_paths) {
|
|
||||||
for (i = 0; i < list->nr; i++)
|
|
||||||
free(list->items[i].path);
|
|
||||||
}
|
|
||||||
if (free_util) {
|
|
||||||
for (i = 0; i < list->nr; i++)
|
|
||||||
free(list->items[i].util);
|
|
||||||
}
|
|
||||||
free(list->items);
|
|
||||||
}
|
|
||||||
list->items = NULL;
|
|
||||||
list->nr = list->alloc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_path_list(const char *text, const struct path_list *p)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if ( text )
|
|
||||||
printf("%s\n", text);
|
|
||||||
for (i = 0; i < p->nr; i++)
|
|
||||||
printf("%s:%p\n", p->items[i].path, p->items[i].util);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct path_list_item *path_list_append(const char *path, struct path_list *list)
|
|
||||||
{
|
|
||||||
ALLOC_GROW(list->items, list->nr + 1, list->alloc);
|
|
||||||
list->items[list->nr].path =
|
|
||||||
list->strdup_paths ? xstrdup(path) : (char *)path;
|
|
||||||
return list->items + list->nr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cmp_items(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
const struct path_list_item *one = a;
|
|
||||||
const struct path_list_item *two = b;
|
|
||||||
return strcmp(one->path, two->path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sort_path_list(struct path_list *list)
|
|
||||||
{
|
|
||||||
qsort(list->items, list->nr, sizeof(*list->items), cmp_items);
|
|
||||||
}
|
|
||||||
|
|
||||||
int unsorted_path_list_has_path(struct path_list *list, const char *path)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < list->nr; i++)
|
|
||||||
if (!strcmp(path, list->items[i].path))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
28
path-list.h
28
path-list.h
@ -1,28 +0,0 @@
|
|||||||
#ifndef PATH_LIST_H
|
|
||||||
#define PATH_LIST_H
|
|
||||||
|
|
||||||
struct path_list_item {
|
|
||||||
char *path;
|
|
||||||
void *util;
|
|
||||||
};
|
|
||||||
struct path_list
|
|
||||||
{
|
|
||||||
struct path_list_item *items;
|
|
||||||
unsigned int nr, alloc;
|
|
||||||
unsigned int strdup_paths:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
void print_path_list(const char *text, const struct path_list *p);
|
|
||||||
void path_list_clear(struct path_list *list, int free_util);
|
|
||||||
|
|
||||||
/* Use these functions only on sorted lists: */
|
|
||||||
int path_list_has_path(const struct path_list *list, const char *path);
|
|
||||||
struct path_list_item *path_list_insert(const char *path, struct path_list *list);
|
|
||||||
struct path_list_item *path_list_lookup(const char *path, struct path_list *list);
|
|
||||||
|
|
||||||
/* Use these functions only on unsorted lists: */
|
|
||||||
struct path_list_item *path_list_append(const char *path, struct path_list *list);
|
|
||||||
void sort_path_list(struct path_list *list);
|
|
||||||
int unsorted_path_list_has_path(struct path_list *list, const char *path);
|
|
||||||
|
|
||||||
#endif /* PATH_LIST_H */
|
|
4
pretty.c
4
pretty.c
@ -3,7 +3,7 @@
|
|||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "diff.h"
|
#include "diff.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "mailmap.h"
|
#include "mailmap.h"
|
||||||
|
|
||||||
static char *user_format;
|
static char *user_format;
|
||||||
@ -292,7 +292,7 @@ static char *logmsg_reencode(const struct commit *commit,
|
|||||||
|
|
||||||
static int mailmap_name(struct strbuf *sb, const char *email)
|
static int mailmap_name(struct strbuf *sb, const char *email)
|
||||||
{
|
{
|
||||||
static struct path_list *mail_map;
|
static struct string_list *mail_map;
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
|
|
||||||
if (!mail_map) {
|
if (!mail_map) {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "diff.h"
|
#include "diff.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "reflog-walk.h"
|
#include "reflog-walk.h"
|
||||||
|
|
||||||
struct complete_reflogs {
|
struct complete_reflogs {
|
||||||
@ -127,7 +127,7 @@ struct commit_reflog {
|
|||||||
|
|
||||||
struct reflog_walk_info {
|
struct reflog_walk_info {
|
||||||
struct commit_info_lifo reflogs;
|
struct commit_info_lifo reflogs;
|
||||||
struct path_list complete_reflogs;
|
struct string_list complete_reflogs;
|
||||||
struct commit_reflog *last_commit_reflog;
|
struct commit_reflog *last_commit_reflog;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||||||
{
|
{
|
||||||
unsigned long timestamp = 0;
|
unsigned long timestamp = 0;
|
||||||
int recno = -1;
|
int recno = -1;
|
||||||
struct path_list_item *item;
|
struct string_list_item *item;
|
||||||
struct complete_reflogs *reflogs;
|
struct complete_reflogs *reflogs;
|
||||||
char *branch, *at = strchr(name, '@');
|
char *branch, *at = strchr(name, '@');
|
||||||
struct commit_reflog *commit_reflog;
|
struct commit_reflog *commit_reflog;
|
||||||
@ -161,7 +161,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||||||
} else
|
} else
|
||||||
recno = 0;
|
recno = 0;
|
||||||
|
|
||||||
item = path_list_lookup(branch, &info->complete_reflogs);
|
item = string_list_lookup(branch, &info->complete_reflogs);
|
||||||
if (item)
|
if (item)
|
||||||
reflogs = item->util;
|
reflogs = item->util;
|
||||||
else {
|
else {
|
||||||
@ -189,7 +189,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||||||
}
|
}
|
||||||
if (!reflogs || reflogs->nr == 0)
|
if (!reflogs || reflogs->nr == 0)
|
||||||
return -1;
|
return -1;
|
||||||
path_list_insert(branch, &info->complete_reflogs)->util
|
string_list_insert(branch, &info->complete_reflogs)->util
|
||||||
= reflogs;
|
= reflogs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
rerere.c
40
rerere.c
@ -1,5 +1,5 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
#include "rerere.h"
|
#include "rerere.h"
|
||||||
#include "xdiff/xdiff.h"
|
#include "xdiff/xdiff.h"
|
||||||
#include "xdiff-interface.h"
|
#include "xdiff-interface.h"
|
||||||
@ -23,7 +23,7 @@ static int has_resolution(const char *name)
|
|||||||
return !stat(rr_path(name, "postimage"), &st);
|
return !stat(rr_path(name, "postimage"), &st);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_rr(struct path_list *rr)
|
static void read_rr(struct string_list *rr)
|
||||||
{
|
{
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
@ -43,14 +43,14 @@ static void read_rr(struct path_list *rr)
|
|||||||
; /* do nothing */
|
; /* do nothing */
|
||||||
if (i == sizeof(buf))
|
if (i == sizeof(buf))
|
||||||
die("filename too long");
|
die("filename too long");
|
||||||
path_list_insert(buf, rr)->util = name;
|
string_list_insert(buf, rr)->util = name;
|
||||||
}
|
}
|
||||||
fclose(in);
|
fclose(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct lock_file write_lock;
|
static struct lock_file write_lock;
|
||||||
|
|
||||||
static int write_rr(struct path_list *rr, int out_fd)
|
static int write_rr(struct string_list *rr, int out_fd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < rr->nr; i++) {
|
for (i = 0; i < rr->nr; i++) {
|
||||||
@ -58,7 +58,7 @@ static int write_rr(struct path_list *rr, int out_fd)
|
|||||||
int length;
|
int length;
|
||||||
if (!rr->items[i].util)
|
if (!rr->items[i].util)
|
||||||
continue;
|
continue;
|
||||||
path = rr->items[i].path;
|
path = rr->items[i].string;
|
||||||
length = strlen(path) + 1;
|
length = strlen(path) + 1;
|
||||||
if (write_in_full(out_fd, rr->items[i].util, 40) != 40 ||
|
if (write_in_full(out_fd, rr->items[i].util, 40) != 40 ||
|
||||||
write_in_full(out_fd, "\t", 1) != 1 ||
|
write_in_full(out_fd, "\t", 1) != 1 ||
|
||||||
@ -154,7 +154,7 @@ static int handle_file(const char *path,
|
|||||||
return hunk_no;
|
return hunk_no;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_conflict(struct path_list *conflict)
|
static int find_conflict(struct string_list *conflict)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (read_cache() < 0)
|
if (read_cache() < 0)
|
||||||
@ -167,7 +167,7 @@ static int find_conflict(struct path_list *conflict)
|
|||||||
ce_same_name(e2, e3) &&
|
ce_same_name(e2, e3) &&
|
||||||
S_ISREG(e2->ce_mode) &&
|
S_ISREG(e2->ce_mode) &&
|
||||||
S_ISREG(e3->ce_mode)) {
|
S_ISREG(e3->ce_mode)) {
|
||||||
path_list_insert((const char *)e2->name, conflict);
|
string_list_insert((const char *)e2->name, conflict);
|
||||||
i++; /* skip over both #2 and #3 */
|
i++; /* skip over both #2 and #3 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,7 +208,7 @@ static int merge(const char *name, const char *path)
|
|||||||
|
|
||||||
static struct lock_file index_lock;
|
static struct lock_file index_lock;
|
||||||
|
|
||||||
static int update_paths(struct path_list *update)
|
static int update_paths(struct string_list *update)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int fd = hold_locked_index(&index_lock, 0);
|
int fd = hold_locked_index(&index_lock, 0);
|
||||||
@ -218,8 +218,8 @@ static int update_paths(struct path_list *update)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < update->nr; i++) {
|
for (i = 0; i < update->nr; i++) {
|
||||||
struct path_list_item *item = &update->items[i];
|
struct string_list_item *item = &update->items[i];
|
||||||
if (add_file_to_cache(item->path, ADD_CACHE_IGNORE_ERRORS))
|
if (add_file_to_cache(item->string, ADD_CACHE_IGNORE_ERRORS))
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,10 +232,10 @@ static int update_paths(struct path_list *update)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_plain_rerere(struct path_list *rr, int fd)
|
static int do_plain_rerere(struct string_list *rr, int fd)
|
||||||
{
|
{
|
||||||
struct path_list conflict = { NULL, 0, 0, 1 };
|
struct string_list conflict = { NULL, 0, 0, 1 };
|
||||||
struct path_list update = { NULL, 0, 0, 1 };
|
struct string_list update = { NULL, 0, 0, 1 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
find_conflict(&conflict);
|
find_conflict(&conflict);
|
||||||
@ -248,8 +248,8 @@ static int do_plain_rerere(struct path_list *rr, int fd)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < conflict.nr; i++) {
|
for (i = 0; i < conflict.nr; i++) {
|
||||||
const char *path = conflict.items[i].path;
|
const char *path = conflict.items[i].string;
|
||||||
if (!path_list_has_path(rr, path)) {
|
if (!string_list_has_string(rr, path)) {
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
char *hex;
|
char *hex;
|
||||||
int ret;
|
int ret;
|
||||||
@ -257,7 +257,7 @@ static int do_plain_rerere(struct path_list *rr, int fd)
|
|||||||
if (ret < 1)
|
if (ret < 1)
|
||||||
continue;
|
continue;
|
||||||
hex = xstrdup(sha1_to_hex(sha1));
|
hex = xstrdup(sha1_to_hex(sha1));
|
||||||
path_list_insert(path, rr)->util = hex;
|
string_list_insert(path, rr)->util = hex;
|
||||||
if (mkdir(git_path("rr-cache/%s", hex), 0755))
|
if (mkdir(git_path("rr-cache/%s", hex), 0755))
|
||||||
continue;;
|
continue;;
|
||||||
handle_file(path, NULL, rr_path(hex, "preimage"));
|
handle_file(path, NULL, rr_path(hex, "preimage"));
|
||||||
@ -273,13 +273,13 @@ static int do_plain_rerere(struct path_list *rr, int fd)
|
|||||||
|
|
||||||
for (i = 0; i < rr->nr; i++) {
|
for (i = 0; i < rr->nr; i++) {
|
||||||
int ret;
|
int ret;
|
||||||
const char *path = rr->items[i].path;
|
const char *path = rr->items[i].string;
|
||||||
const char *name = (const char *)rr->items[i].util;
|
const char *name = (const char *)rr->items[i].util;
|
||||||
|
|
||||||
if (has_resolution(name)) {
|
if (has_resolution(name)) {
|
||||||
if (!merge(name, path)) {
|
if (!merge(name, path)) {
|
||||||
if (rerere_autoupdate)
|
if (rerere_autoupdate)
|
||||||
path_list_insert(path, &update);
|
string_list_insert(path, &update);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s '%s' using previous resolution.\n",
|
"%s '%s' using previous resolution.\n",
|
||||||
rerere_autoupdate
|
rerere_autoupdate
|
||||||
@ -337,7 +337,7 @@ static int is_rerere_enabled(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setup_rerere(struct path_list *merge_rr)
|
int setup_rerere(struct string_list *merge_rr)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ int setup_rerere(struct path_list *merge_rr)
|
|||||||
|
|
||||||
int rerere(void)
|
int rerere(void)
|
||||||
{
|
{
|
||||||
struct path_list merge_rr = { NULL, 0, 0, 1 };
|
struct string_list merge_rr = { NULL, 0, 0, 1 };
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = setup_rerere(&merge_rr);
|
fd = setup_rerere(&merge_rr);
|
||||||
|
4
rerere.h
4
rerere.h
@ -1,9 +1,9 @@
|
|||||||
#ifndef RERERE_H
|
#ifndef RERERE_H
|
||||||
#define RERERE_H
|
#define RERERE_H
|
||||||
|
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
extern int setup_rerere(struct path_list *);
|
extern int setup_rerere(struct string_list *);
|
||||||
extern int rerere(void);
|
extern int rerere(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#ifndef SHORTLOG_H
|
#ifndef SHORTLOG_H
|
||||||
#define SHORTLOG_H
|
#define SHORTLOG_H
|
||||||
|
|
||||||
#include "path-list.h"
|
#include "string-list.h"
|
||||||
|
|
||||||
struct shortlog {
|
struct shortlog {
|
||||||
struct path_list list;
|
struct string_list list;
|
||||||
int summary;
|
int summary;
|
||||||
int wrap_lines;
|
int wrap_lines;
|
||||||
int sort_by_number;
|
int sort_by_number;
|
||||||
@ -15,7 +15,7 @@ struct shortlog {
|
|||||||
|
|
||||||
char *common_repo_prefix;
|
char *common_repo_prefix;
|
||||||
int email;
|
int email;
|
||||||
struct path_list mailmap;
|
struct string_list mailmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
void shortlog_init(struct shortlog *log);
|
void shortlog_init(struct shortlog *log);
|
||||||
|
134
string-list.c
Normal file
134
string-list.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
#include "cache.h"
|
||||||
|
#include "string-list.h"
|
||||||
|
|
||||||
|
/* if there is no exact match, point to the index where the entry could be
|
||||||
|
* inserted */
|
||||||
|
static int get_entry_index(const struct string_list *list, const char *string,
|
||||||
|
int *exact_match)
|
||||||
|
{
|
||||||
|
int left = -1, right = list->nr;
|
||||||
|
|
||||||
|
while (left + 1 < right) {
|
||||||
|
int middle = (left + right) / 2;
|
||||||
|
int compare = strcmp(string, list->items[middle].string);
|
||||||
|
if (compare < 0)
|
||||||
|
right = middle;
|
||||||
|
else if (compare > 0)
|
||||||
|
left = middle;
|
||||||
|
else {
|
||||||
|
*exact_match = 1;
|
||||||
|
return middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*exact_match = 0;
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns -1-index if already exists */
|
||||||
|
static int add_entry(struct string_list *list, const char *string)
|
||||||
|
{
|
||||||
|
int exact_match;
|
||||||
|
int index = get_entry_index(list, string, &exact_match);
|
||||||
|
|
||||||
|
if (exact_match)
|
||||||
|
return -1 - index;
|
||||||
|
|
||||||
|
if (list->nr + 1 >= list->alloc) {
|
||||||
|
list->alloc += 32;
|
||||||
|
list->items = xrealloc(list->items, list->alloc
|
||||||
|
* sizeof(struct string_list_item));
|
||||||
|
}
|
||||||
|
if (index < list->nr)
|
||||||
|
memmove(list->items + index + 1, list->items + index,
|
||||||
|
(list->nr - index)
|
||||||
|
* sizeof(struct string_list_item));
|
||||||
|
list->items[index].string = list->strdup_strings ?
|
||||||
|
xstrdup(string) : (char *)string;
|
||||||
|
list->items[index].util = NULL;
|
||||||
|
list->nr++;
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string_list_item *string_list_insert(const char *string, struct string_list *list)
|
||||||
|
{
|
||||||
|
int index = add_entry(list, string);
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
index = -1 - index;
|
||||||
|
|
||||||
|
return list->items + index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int string_list_has_string(const struct string_list *list, const char *string)
|
||||||
|
{
|
||||||
|
int exact_match;
|
||||||
|
get_entry_index(list, string, &exact_match);
|
||||||
|
return exact_match;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string_list_item *string_list_lookup(const char *string, struct string_list *list)
|
||||||
|
{
|
||||||
|
int exact_match, i = get_entry_index(list, string, &exact_match);
|
||||||
|
if (!exact_match)
|
||||||
|
return NULL;
|
||||||
|
return list->items + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void string_list_clear(struct string_list *list, int free_util)
|
||||||
|
{
|
||||||
|
if (list->items) {
|
||||||
|
int i;
|
||||||
|
if (list->strdup_strings) {
|
||||||
|
for (i = 0; i < list->nr; i++)
|
||||||
|
free(list->items[i].string);
|
||||||
|
}
|
||||||
|
if (free_util) {
|
||||||
|
for (i = 0; i < list->nr; i++)
|
||||||
|
free(list->items[i].util);
|
||||||
|
}
|
||||||
|
free(list->items);
|
||||||
|
}
|
||||||
|
list->items = NULL;
|
||||||
|
list->nr = list->alloc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_string_list(const char *text, const struct string_list *p)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if ( text )
|
||||||
|
printf("%s\n", text);
|
||||||
|
for (i = 0; i < p->nr; i++)
|
||||||
|
printf("%s:%p\n", p->items[i].string, p->items[i].util);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string_list_item *string_list_append(const char *string, struct string_list *list)
|
||||||
|
{
|
||||||
|
ALLOC_GROW(list->items, list->nr + 1, list->alloc);
|
||||||
|
list->items[list->nr].string =
|
||||||
|
list->strdup_strings ? xstrdup(string) : (char *)string;
|
||||||
|
return list->items + list->nr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmp_items(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const struct string_list_item *one = a;
|
||||||
|
const struct string_list_item *two = b;
|
||||||
|
return strcmp(one->string, two->string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sort_string_list(struct string_list *list)
|
||||||
|
{
|
||||||
|
qsort(list->items, list->nr, sizeof(*list->items), cmp_items);
|
||||||
|
}
|
||||||
|
|
||||||
|
int unsorted_string_list_has_string(struct string_list *list, const char *string)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < list->nr; i++)
|
||||||
|
if (!strcmp(string, list->items[i].string))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
28
string-list.h
Normal file
28
string-list.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef PATH_LIST_H
|
||||||
|
#define PATH_LIST_H
|
||||||
|
|
||||||
|
struct string_list_item {
|
||||||
|
char *string;
|
||||||
|
void *util;
|
||||||
|
};
|
||||||
|
struct string_list
|
||||||
|
{
|
||||||
|
struct string_list_item *items;
|
||||||
|
unsigned int nr, alloc;
|
||||||
|
unsigned int strdup_strings:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
void print_string_list(const char *text, const struct string_list *p);
|
||||||
|
void string_list_clear(struct string_list *list, int free_util);
|
||||||
|
|
||||||
|
/* Use these functions only on sorted lists: */
|
||||||
|
int string_list_has_string(const struct string_list *list, const char *string);
|
||||||
|
struct string_list_item *string_list_insert(const char *string, struct string_list *list);
|
||||||
|
struct string_list_item *string_list_lookup(const char *string, struct string_list *list);
|
||||||
|
|
||||||
|
/* Use these functions only on unsorted lists: */
|
||||||
|
struct string_list_item *string_list_append(const char *string, struct string_list *list);
|
||||||
|
void sort_string_list(struct string_list *list);
|
||||||
|
int unsorted_string_list_has_string(struct string_list *list, const char *string);
|
||||||
|
|
||||||
|
#endif /* PATH_LIST_H */
|
Loading…
Reference in New Issue
Block a user